我正在测试下面的代码,但编译器在我用C++ 11编译时说:
error: call of overloaded ‘func_A(int)’ is ambiguous
谁能解释一下?
这是代码:
template<typename T> class MC {
public:
void func_A(int a, T initvalue = T()) {}
void func_A(int a) {}
void func_B(int b, T) {}
void func_B(int b) {}
};
int main(void) {
MC<int> mc;
mc.func_A(1); // error: detects call of overloaded
mc.func_A(1,2); // OK
mc.func_B(10); // OK
mc.func_B(10,11); // OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
完整的编译消息:
$ g++ -std=c++11 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:12:16: error: call of overloaded ‘func_A(int)’ is ambiguous
mc.func_A(1);
^
test.cpp:12:16: note: candidates are:
test.cpp:3:10: note: void MC<T>::func_A(int, T) [with T = int]
void func_A(int a, T initvalue = T()) {}
^
test.cpp:4:10: note: void MC<T>::func_A(int) [with T = int]
void func_A(int a) {}
^
Run Code Online (Sandbox Code Playgroud)
你有一个成员函数:
void func_A(int a, T initvalue = T()) {}
Run Code Online (Sandbox Code Playgroud)
可以像这样调用:
mc.func_A(1);
Run Code Online (Sandbox Code Playgroud)
然后你有一个重载的成员函数:
void func_A(int a) {}
Run Code Online (Sandbox Code Playgroud)
也可以像这样调用:
mc.func_A(1);
Run Code Online (Sandbox Code Playgroud)
编译器如何知道您打算通过该行调用哪个函数?答:不可以.这种模糊的函数调用是不正确的.解决方案:删除重载或默认参数,以便不存在歧义.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |