在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)
。
答案 0 :(得分:0)
如果你的代码中有这个地方,
long x = 1;
env << x;
其中env
的类型为Envir
,那么模板应该明确解析,以调用ostream
的正确流媒体运算符。
所以我认为错误出现在模板定义本身之外的某个地方。也许某个地方你做过这样的事情:
env << n;
其中env
是Envir
,不知何故,n
的类型可能会投放到long
或unsigned long
,但它是不是已定义ostream::operator<<
函数的任何类型。我不确定那是什么类型。