为什么编译器在C++ 11中给出消息"调用重载函数是不明确的"?

Sea*_*n83 -6 c++ c++11 c++14

我正在测试下面的代码,但编译器在我用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)

eer*_*ika 6

你有一个成员函数:

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)

编译器如何知道您打算通过该行调用哪个函数?答:不可以.这种模糊的函数调用是不正确的.解决方案:删除重载或默认参数,以便不存在歧义.