我是模板编码的初学者,在模板中定义构造函数时遇到了问题,只是找了相关的答案,却找不到相关的问题。
基本上,类/结构xpair
类似于pair
first
和second
。
template <typename First, typename Second>
struct xpair {
First first{};
Second second{};
xpair(){}
xpair (const First& first, const Second& second):
first(first), second(second) {}
xpair& operator() (const First& first_, const Second& second_) {
return new xpair (first_, second_);
}
xpair& operator= (const xpair& that) {
return new xpair (that.first, that.second);
}
};
当我想写一些像
这样的东西时xpair<string, string> a, b;
a = b;
它给出错误
non-const lvalue reference to type
'xpair<std::__1::basic_string<char>, std::__1::basic_string<char> >'
cannot bind to a temporary of type 'xpair<std::__1::basic_string<char>,
std::__1::basic_string<char> > *'
我尝试重写
return new xpair (that.first, that.second);
到
return new pair (const_cast<First&>(that.first), const_cast<First&>(that.second));
但它不起作用。问题出在哪里?
答案 0 :(得分:4)
放弃new
。这不是Java!
在C ++中,new
是动态分配的关键字(评估指针),你没有使用它。
您还必须重新考虑返回引用语义,因为您将返回对局部变量的引用。这使得悬空引用。
事实上,你的语义总体上看起来很奇怪。例如,为什么operator=
实际上没有修改分配给的对象?您应该从that
分配给*this
的成员,然后返回对*this
的引用(或至少返回void
)。
我不知道你的operator()
应该做什么 - 那应该是构造函数吗?嗯,不,你已经有了其中一个...... :(
我强烈建议您查看一些运算符重载的示例,以便更好地理解C ++的构造和约束,以及我们的习语和首选语义。