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;