我正在尝试使用解除引用运算符打印新创建的节点。
我的主要功能
int main ()
{
Insert(3);
return 0;
}
插入()功能
void Insert(int data)
{
Node *temp = new Node ;
temp -> data = data ;
temp -> next = NULL ;
cout << *temp ;
}
我的错误:
tp.cpp: In function ‘void Insert(int)’:
tp.cpp:27:10: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Node’)
cout << *temp ;
答案 0 :(得分:1)
问题: C ++仅为其基本类型提供运算符,对于用户定义的类型,我们必须编写自己的运算符。错误no match for ‘operator<<’
表示编译器无法针对语句<<
cout << *temp ;
运算符
可能的解决方案:
与@ user4581301相同,您可以为<<
Node
cout << *temp ;
write your own operator个。{/ p>
您还可以将cout << temp->data ;
语句替换为cout << (*temp).data ;
或->
,因为temp是指向结构的指针。您可以在data
之前使用.
或使用*
访问/node_modules/passport-oauth1/lib/strategy.js:396:17)
,但可以在使用console.log
运算符取消引用之后使用xmkmf -a
。
答案 1 :(得分:0)
任何操作员基本上都是一个功能。 例如,为类Rational添加运算符+的加法运算符可能表示为成员函数:
class Rational
{
private:
...
...
public:
...
//Implicit arg "this" is Left Hand operand.
//Explicitly stated arg objRational is Right Hand operand.
Rational operator+(const Rational& objRational) const {...};
...
};
请注意,这里的参数是
const
,以确保我们不会意外地修改操作数本身,并且函数标记自己const
以确保我们不修改{{1}对象。 Arg是由ref传递的,因为如果我们没有肯定地修改它,就不需要复制并且没有损坏ref。
以上在技术上是一个功能,所以你可以做类似
的事情this
然后只是添加到C ++语法的语法糖,允许与
进行相同的调用 Rational r1(3, 4), r2(22, 7);
Rational r3 = r1.operator+(r2); //Really possible! Try it!
你写了
Rational r3 = r1 + r2;
其中,cout << *temp ;
的类型是Node,(*temp)
是cout
类的对象。
因此,编译器现在正在寻找一个带左手操作数的重载运算符ostream
对象,右手操作数寻找一个ostream
对象。
所以,它就像在类ostream本身的某个地方写作一样好,
Node
但是,我们没有这种可能性,因为我们首先没有编写类ostream。当它被写入时,你的节点不存在!此外,它可能需要访问objNode的私有成员,这些成员不允许使用不属于Node类的成员。
如果我们尝试将其作为Node类的成员,它可以访问Node的私有成员。但是现在class ostream : ...
{
...
...
//Here, the only one explicit arg is Node,
//which is Right Hand side operand.
//Since it is a member operator,
//implicit arg "this" will be, by default, the LH operand.
public ostream& oprtator<<(const Node& objNode){...}
...
}
的左手操作数需要是Node,这会破坏整个目的。
所以,我们所做的就是让它成为朋友的功能。
operator<<
这会创建一个class Node
{
...
...
public:
...
//Since this is NOT a member, bot LH and RH operand need to be stated explicitelty
friend ostream& operator<< (ostream& out, const Node& objNode) { out << node.data; return out; }
...
};
,它将操作数保留为operator<<
,右操作数为ostream
,并且可以访问Node的私有成员,因为它是朋友。 (^ _ ^)
为什么接受ostream对象的并返回引用?
因为,当您尝试链接调用时,需要连续写入相同的对象。
考虑一个陈述:node
它将被评估为
cout << "First: " << objNode1 << ", Second: " << objNode2;
从内到外,对于每次调用,我们需要将(
(
(
cout << "First: " //Innermost call
) << objNode1
) << ", Second: "
)<< objNode2;
个对象传递给具有所有先前插入的重载运算符,因此内部调用需要将引用返回到已修改(插入后) <{1}}的对象将被退回。
希望它有所帮助;快乐编码:)