为什么这两个函数不能重载呢?
Why these two functions cannot be overloaded?
为什么我不能重载这两个函数?
#include <iostream>
using namespace std;
class Base
{
public:
void run(int a);
void run(const int a);
};
int main() {
// your code goes here
return 0;
}
输出:
prog.cpp:8:7: error: 'void Base::run(int)' cannot be overloaded
void run(const int a);
^
prog.cpp:7:7: error: with 'void Base::run(int)'
void run(int a);
按照标准:
13.1 Overloadable declarations
....
(3.4) — Parameter declarations that differ only in the presence or absence of const
and/or volatile
are
equivalent. That is, the const
and volatile
type-specifiers for each parameter type are ignored when
determining which function is being declared, defined, or called. [ Example:
typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { /* ... */ } // definition of f(int)
int f (cInt) { /* ... */ } // error: redefinition of f(int)
—end example ]
Only the const
and volatile
type-specifiers at the outermost level of the parameter type specification
are ignored in this fashion; const
and volatile
type-specifiers buried within a parameter type
specification are significant and can be used to distinguish overloaded function declarations. In
particular, for any type T
, “pointer to T
,” “pointer to const T
,” and “pointer to volatile T
” are
considered distinct parameter types, as are “reference to T
,” “reference to const T
,” and “reference to
volatile T
.”
为什么我不能重载这两个函数?
#include <iostream>
using namespace std;
class Base
{
public:
void run(int a);
void run(const int a);
};
int main() {
// your code goes here
return 0;
}
输出:
prog.cpp:8:7: error: 'void Base::run(int)' cannot be overloaded
void run(const int a);
^
prog.cpp:7:7: error: with 'void Base::run(int)'
void run(int a);
按照标准:
13.1 Overloadable declarations
....(3.4) — Parameter declarations that differ only in the presence or absence of
const
and/orvolatile
are equivalent. That is, theconst
andvolatile
type-specifiers for each parameter type are ignored when determining which function is being declared, defined, or called. [ Example:typedef const int cInt; int f (int); int f (const int); // redeclaration of f(int) int f (int) { /* ... */ } // definition of f(int) int f (cInt) { /* ... */ } // error: redefinition of f(int)
—end example ]
Only the
const
andvolatile
type-specifiers at the outermost level of the parameter type specification are ignored in this fashion;const
andvolatile
type-specifiers buried within a parameter type specification are significant and can be used to distinguish overloaded function declarations. In particular, for any typeT
, “pointer toT
,” “pointer toconst T
,” and “pointer tovolatile T
” are considered distinct parameter types, as are “reference toT
,” “reference toconst T
,” and “reference tovolatile T
.”