错误:在C ++中使用模板时,'operator<<'的模糊重载

时间:2013-04-22 21:36:47

标签: c++ templates g++ llvm

在C ++中使用此模板重载运算符<<<

template<typename T> cEnvir& operator<<(const T& t) {out << t; return *this;}

我有这个模棱两可的错误。

error: ambiguous overload for ‘operator<<’ in ‘((cEnvir*)this)->cEnvir::out << t’
/usr/include/c++/4.2.1/ostream:169: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>] <near match>

/usr/include/c++/4.2.1/ostream:173: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]

...

对于typename T,问题似乎是编译器无法确定匹配的问题。 当我注释掉/* out << t; */时,编译工作正常。

如何解决此问题? 我使用gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

1 个答案:

答案 0 :(得分:0)

如果你的代码中有这个地方,

long x = 1;
env << x;

其中env的类型为Envir,那么模板应该明确解析,以调用ostream的正确流媒体运算符。

所以我认为错误出现在模板定义本身之外的某个地方。也许某个地方你做过这样的事情:

env << n;

其中envEnvir,不知何故,n的类型可能会投放到longunsigned long,但它是不是已定义ostream::operator<<函数的任何类型。我不确定那是什么类型。