如何解决“不明确的过载”问题重载运算符<<时出错(模板化)?

发布于 2024-12-10 07:35:06 字数 759 浏览 1 评论 0 原文

我正在尝试超载 <<运算符,但我收到以下错误:

错误:“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;
    }

提前感谢您提供的任何帮助。

I am trying to overload the << operator, but I get the following error:

error: ambiguous overload for 'operator<<' in 'std::cout << "Test "'

..Followed by 5 billion other errors similar to:

c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/ostream:165:7: note:
candidates are: ...

This comes up because I'm using cout in my main.cpp file.

Here is my code:

In BinTree.h:

    template <typename T>
    class BinTree{
    ...
    friend std::ostream& operator<< <>(std::ostream&, const T&);

In BinTree.cpp:

    template <typename T>
    std::ostream& operator<< (std:: ostream& o, const T& value){
        return o << value;
    }

Thanks in advance for any help you can give.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南渊 2024-12-17 07:35:06

您的函数具有与已定义的函数相同的签名。这就是编译器抱怨不明确的重载的原因。您的函数尝试定义一个函数来将所有内容流式传输到 ostream。该函数已存在于标准库中。

template <typename T>
std::ostream& operator<< (std:: ostream& o, const T& value){
    return o << value;
}

您可能想要做的是编写一个函数来定义 BinTree 如何流式传输(到所有内容)。请注意,流类型是模板化的。因此,如果将调用链接到流运算符,它将流式传输具体类型。

template <typename T, typename U>
T& operator<< (T& o, const BinTree<U>& value){
    //Stream all the nodes in your tree....
    return o;
}

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.

template <typename T>
std::ostream& operator<< (std:: ostream& o, const T& value){
    return o << value;
}

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.

template <typename T, typename U>
T& operator<< (T& o, const BinTree<U>& value){
    //Stream all the nodes in your tree....
    return o;
}
画▽骨i 2024-12-17 07:35:06

你的意思..

template<class T>
ostream& operator<<(ostream& os, const BinTree<T>& v){
    typename BinTree<T>::iterator it;
    for(it = v.begin(); it != v.end(); ++it){
                 os << *it << endl;
    }
    return os;
}

Did you mean..

template<class T>
ostream& operator<<(ostream& os, const BinTree<T>& v){
    typename BinTree<T>::iterator it;
    for(it = v.begin(); it != v.end(); ++it){
                 os << *it << endl;
    }
    return os;
}
独享拥抱 2024-12-17 07:35:06

发布更多代码,直到看到这部分:

template <typename T>
std::ostream& operator<< (std:: ostream& o, const T& value){
    return o << value;
}

这只是调用自身。是递归调用。 operator<< 定义为输出 T 类型的值,当您编写 o< 时,它会调用自身,如下所示value 的类型是 T

其次,由于这是函数模板,因此如果您希望代码通过包含 来工作,则应在 .h 文件中提供定义,而不是在 .cpp 文件中提供.h 文件。

Post more code, till then see this part:

template <typename T>
std::ostream& operator<< (std:: ostream& o, const T& value){
    return o << value;
}

This is doing nothing but calling itself. It is recursive call. The operator<< is defined to output value of type T, and when you write o<<value, it calls itself, as the type of value is T.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文