如何解决“不明确的过载”问题重载运算符<<时出错(模板化)?
我正在尝试超载 <<运算符,但我收到以下错误:
错误:“operator<<”的重载不明确在 'std::cout << “测试”'
..随后出现 50 亿个类似以下内容的其他错误:
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/ostream:165:7:注意: 候选人是:...
出现这个问题是因为我在 main.cpp 文件中使用 cout 。
这是我的代码:
在 BinTree.h 中:
template <typename T>
class BinTree{
...
friend std::ostream& operator<< <>(std::ostream&, const T&);
在 BinTree.cpp 中:
template <typename T>
std::ostream& operator<< (std:: ostream& o, const T& value){
return o << value;
}
提前感谢您提供的任何帮助。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您的函数具有与已定义的函数相同的签名。这就是编译器抱怨不明确的重载的原因。您的函数尝试定义一个函数来将所有内容流式传输到 ostream。该函数已存在于标准库中。
您可能想要做的是编写一个函数来定义 BinTree 如何流式传输(到所有内容)。请注意,流类型是模板化的。因此,如果将调用链接到流运算符,它将流式传输具体类型。
Your function has the same signature than the one already defined. This is why the compiler moans about ambigous overload. Your function tries to define a function to stream everything to a ostream. This function already exists in the standards library.
What you perhaps want to do is write a function that defines how a BinTree is streamed (to everything). Please note that the stream type is templated. So if you chain the calls to the stream operator it streams the concrete type.
你的意思..
Did you mean..
发布更多代码,直到看到这部分:
这只是调用自身。是递归调用。
operator<<
定义为输出T
类型的值,当您编写o< 时,它会调用自身,如下所示
value
的类型是T
。其次,由于这是函数模板,因此如果您希望代码通过包含
来工作,则应在
.h
文件中提供定义,而不是在.cpp
文件中提供.h 文件。Post more code, till then see this part:
This is doing nothing but calling itself. It is recursive call. The
operator<<
is defined to output value of typeT
, and when you writeo<<value
, it calls itself, as the type ofvalue
isT
.Second, since this is function-template, the definition should be provided in the
.h
file, not in.cpp
file if you expect your code working by including.h
file.