C++ 不总是在模板化类上调用赋值运算符
我这里有奇怪的东西。有一个类模板:C++ 不总是在模板化类上调用赋值运算符,c++,operator-overloading,C++,Operator Overloading,我这里有奇怪的东西。有一个类模板: #include <iostream> template<class ValueType> class OpTest { public: //normal ctor OpTest(ValueType newVal):myVal(newVal) {}; //disable copy ctor template<class OtherValue>
#include <iostream>
template<class ValueType>
class OpTest {
public:
//normal ctor
OpTest(ValueType newVal):myVal(newVal) {};
//disable copy ctor
template<class OtherValue>
OpTest(const OpTest<OtherValue>& other) = delete;
// getter operator
operator ValueType () {
std::cout << "Getter called" << std::endl;
return myVal;
}
// setter operator
template<class OtherValue>
void operator= (const OtherValue& val) {
std::cout << "Setter called" << std::endl;
myVal = static_cast<ValueType>(val);
}
private:
ValueType myVal;
};
对于这样的代码,它可以正常工作:
Tester object;
int v = object.value; // operator ValueType() called
object.value = 42; // operator= (ValueType&) called
但不知何故,这段代码:
Tester objA, objB;
objA.value = objB.value;
不从OpTest
调用任何重载运算符
我之所以这样做setter运算符,是因为我想让我的程序在该方法中执行从
OtherValue
到ValueType
的转换。然而,该方法的内部并不重要,因为在最后一个代码示例中根本没有调用它。为什么?我错过了什么吗?你能提供一个答案吗objA.value=objB.value
转换为objA.value.operator=(objB.value)代码>这应该是您的setter运算符。请提供一个。您的示例没有编译,并且您遗漏了回答问题所需的重要细节。objA.value=objB.value,可能是因为值是未初始化的数据,所以没有操作?@Felix.leg没有什么奇怪的。您忘记了复制操作符:OpTest&operator=(constoptest&obj){std::cout@B0FEE664它可以工作,但您的解决方案让我困惑:为什么要使用更通用的“setter操作符”不是为“ObjalValue= Obj.Valuy”选择的吗?这是否意味着当我的模板运行时,我必须考虑一个特殊情况?
Tester objA, objB;
objA.value = objB.value;