考虑以下程序,它编译并运行良好:
#include <iostream>
#include <string>
using std::string;
struct BB
{
// generic cast
template<typename T>
operator T() const
{
std::cout<<"Generic cast\n";
return 0;
}
// string cast
operator string() const
{
std::cout<<"string cast\n";
return string("hello");
}
};
int main()
{
BB b;
string s = b; // copy constructor
}
但是如果我稍微改变main()
函数的代码如下:
int main()
{
BB b;
string s;
s = b;
}
编译器给出以下错误消息(请参阅此处的实时演示)
[Error] ambiguous overload for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'BB')
为什么这个调用是模棱两可的?这背后的原因是什么?看起来有很多重载,operator=
例如一个 for char
,一个 for char*
,一个 forconst char*
等。这就是上面的程序使编译器变得模棱两可。