C ++模板运营商,不同类型的超载(C++ template operator overloadin

2019-06-23 14:49发布

下面的例子定义了一个基本podtype容器类。 使用这个类的一系列类型定义,然后创建了代表基本podtype的OOP版本。 当我们开始分配这些类型彼此之间的问题起源。

我试图定义操作与使用普通PodObjects类型,但没有任何更迭LHS和RHS参数朋友方法。 是否有任何人谁可能都经历过的东西simular或者知道这个问题的其他解决办法。

提前致谢。

#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;
}

结果在一个编译器输出:

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){

编辑:

下面的朋友的方法做这项工作对我来说:

template<typename U, typename W>
friend PodObject<U> operator+= (PodObject<U> &lhs, PodObject<W> const &rhs) {
    lhs._value += rhs._value;
    return lhs;
} 

Answer 1:

你需要一个模板operator + ,因为你尝试添加不同的类型:

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

这就是说,整个代码看起来像一个反模式。 你“的基本podtype的OOP版”是没有意义的,也通常是有用的,概念。



文章来源: C++ template operator overloading with different types