0

使用 C++ 中的此模板重载 operator<<

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>]

...

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

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

4

1 回答 1

0

如果你的代码中有这个,

long x = 1;
env << x;

whereenv是 类型Envir,那么模板应该明确地解析为调用正确的流操作符ostream

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

env << n;

哪里env是 an Envir,并且不知何故,n是一种可以强制转换为long或的类型unsigned long,但它不是ostream::operator<<已定义函数的任何类型。我不确定那可能是什么类型。

于 2014-03-31T16:31:35.310 回答