C++ C++;使用不同类型重载模板运算符

C++ C++;使用不同类型重载模板运算符,c++,templates,types,overloading,operator-keyword,C++,Templates,Types,Overloading,Operator Keyword,下面的示例定义了一个基本的podtype容器类。然后使用这个类创建一系列TypeDef,它们表示基本podtype的OOP版本。当我们开始相互分配这些类型时,问题就出现了 我尝试将操作符定义为具有lhs和rhs参数的friend方法,使用普通PodObjects作为类型,但没有成功。有没有人可能经历过类似的事情,或者知道这个问题的其他解决方案 提前谢谢 #include <stdint.h> template <typename T> class PodObject {

下面的示例定义了一个基本的podtype容器类。然后使用这个类创建一系列TypeDef,它们表示基本podtype的OOP版本。当我们开始相互分配这些类型时,问题就出现了

我尝试将操作符定义为具有lhs和rhs参数的friend方法,使用普通PodObjects作为类型,但没有成功。有没有人可能经历过类似的事情,或者知道这个问题的其他解决方案

提前谢谢

#include <stdint.h>

template <typename T>
class PodObject {
protected:
    T _value;

public:
    PodObject<T>(int rhs) {
        this->_value = static_cast<T>(rhs);
    }   

    PodObject<T> operator+= (PodObject<T> const &rhs){
        this->_value = rhs._value;
        return *this;
    }   
};  

typedef PodObject<int8_t> Int8;
typedef PodObject<int16_t> Int16;

int main() {
    Int16 a = 10; 
    Int8 b = 15; 

    a += b; // Source of problem
    return 0;
}
#包括
模板
类PodObject{
受保护的:
T_值;
公众:
PodObject(int-rhs){
该->_值=静态_值(rhs);
}   
PodObject运算符+=(PodObject常量和rhs){
此->_值=rhs._值;
归还*这个;
}   
};  
typedef PodObject Int8;
typedef PodObject Int16;
int main(){
int16a=10;
int8b=15;
a+=b;//问题的根源
返回0;
}
生成编译器输出:

example.cpp:26:11: error: no viable overloaded '+='
        a += b;
        ~ ^  ~
example.cpp:13:22: note: candidate function not viable: no known conversion from 'Int8' (aka 'PodObject<int8_t>') to 'const PodObject<short>'
      for 1st argument
        PodObject<T> operator+= (PodObject<T> const &rhs){
example.cpp:26:11:错误:没有可行的重载'+='
a+=b;
~ ^  ~
示例.cpp:13:22:注意:候选函数不可行:没有从“Int8”(又名“PodObject”)到“const PodObject”的已知转换
第一个论点
PodObject运算符+=(PodObject常量和rhs){

编辑:

下面的friend方法为我完成了这项工作:

template<typename U, typename W>
friend PodObject<U> operator+= (PodObject<U> &lhs, PodObject<W> const &rhs) {
    lhs._value += rhs._value;
    return lhs;
} 
模板
friend PodObject操作符+=(PodObject和lhs、PodObject常量和rhs){
左S._值+=右S._值;
返回lhs;
} 

您需要一个模板化的
运算符+
,因为您正在尝试添加不同的类型:

模板
PodObject运算符+=(PodObject常量和rhs){
此->_值=rhs._值;
归还*这个;
}

也就是说,整个代码看起来像一个反模式这不是一个有意义的概念,也不是一个普遍有用的概念。

这更像是一个实验,而不是一件理智的事情,是的,我会为此而下地狱:)。但是感谢你的回答,成员变量需要是公共的,这样才能工作。如果你制作
PodObject
的话,成员变量不需要是公共的彼此的朋友:
template-friend-PodObject;
P.S.如果你真的交付了这段代码,你只会下程序员的地狱。
template <typename U>
PodObject<T> operator+= (PodObject<U> const &rhs){
    this->_value = rhs._value;
    return *this;
}