【问题标题】:How do I fix "ambiguous overload" error when overloading operator<< (templated)?重载运算符<<(模板化)时如何解决“模棱两可的重载”错误?
【发布时间】:2011-10-16 05:36:14
【问题描述】:

我正在尝试重载

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

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

【问题讨论】:

  • 我不完全相信你已经为我们提供了足够的代码来解决这个问题,但是你拥有给我们的信息让我问:为什么@ 987654323@ 是否需要访问 BinTree&lt;T&gt; 的内部,如果它从不使用它们(或 BinTree&lt;T&gt;)?

标签: c++ templates compiler-errors overloading operator-keyword


【解决方案1】:

您的函数与已定义的函数具有相同的签名。这就是编译器抱怨模棱两可的重载的原因。您的函数尝试定义一个函数以将所有内容流式传输到 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;
}

【讨论】:

  • 嗯...你在标准库中究竟是在哪里找到这样的函数的?
【解决方案2】:

你是说……

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;
}

【讨论】:

    【解决方案3】:

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

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

    这只是在调用自己。是递归调用。 operator&lt;&lt;被定义为T类型的输出值,当你写o&lt;&lt;value时,它会调用自己,因为value的类型是T。

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

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多