【问题标题】:no match for 'operator<<' (with including string and ostream and overloading <<) in c++在 C++ 中不匹配 'operator<<'(包括字符串和 ostream 以及重载 <<)
【发布时间】:2014-06-12 10:07:28
【问题描述】:

我正在尝试为具有优先级的列表构建一个模板(模板参数是 T 表示数据,Priority 表示优先级(例如,如果我有一行有成绩的学生,则 T 将是学生他们的优先级将是他们的成绩)。 该列表包含一个 Node 类,每个 Node 包含数据、优先级和指向下一个 Node 的指针。

我尝试为 Node 和列表重载 << 用于列表(打印每个节点)。 例如:如果我想打印名为receptionHour 的列表,使用这一行: cout &lt;&lt; endl &lt;&lt; "containing: " &lt;&lt; receptionHour &lt;&lt; endl;

问题是编译器不识别我实现的运算符,因此它不使用它们并且该行不会编译。我为每一行得到的错误是:

'operator

这是我对&lt;&lt; 运算符、列表(称为 PriorityQueue)和 Node.js 的实现。 Node(inode 节点类女巫在列表类中:

    template<class P, class TT>
    friend ostream& operator<<(ostream& os, Node node){
        os << "[";
        os << node.priority;
        os << ",";
        os << node.data;
        os << "]";
        return os;
    }

列表(称为 PriorityQueue):

template<class P, class TT>
friend ostream& operator<<(PriorityQueue<Priority, T>& queue, std::ostream& os){
    Node* nodePtr = queue.head;
    Node node;
    for(int i = 1; i < queue.sizePQ; i++) {
        node = *nodePtr;
        os << node;
        nodePtr = node.next;
    }
    return os;
}

谢谢!

【问题讨论】:

  • 你定义了Priority类吗?
  • 为什么你的operator&lt;&lt; 是模板化的?

标签: c++ operator-keyword


【解决方案1】:

您没有正确使用模板和operator&lt;&lt; 重载。

(1) 当您声明template&lt;class P, class TT&gt; 时,您使用这些模板的函数声明应为function(P first, Class&lt;TT&gt; second)即使您的类定义(和其他函数)类似于template&lt;class Name&gt; Class(Name name),您也不能使用template&lt;class T&gt; function(Class&lt;Name&gt;),因为模板函数名称必须与模板类名称匹配。

而且Node 的重载不需要使用模板,你知道你使用的是哪种类型(Node)。

(2) 运算符&lt;&lt;的重载函数中,第一个参数必须是ostream对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2022-07-06
    • 2020-11-13
    • 2013-04-17
    相关资源
    最近更新 更多