2012-04-14 66 views
1

下面的例子定義了一個基本podtype容器類過載。然後使用這個類創建一系列代表基本podtype的OOP版本的類型定義。當我們開始將這些類型分配給另一個時,問題就產生了。C++模板操作者與不同類型的

我試圖界定操作與使用普通PodObjects類型但沒有任何更迭LHS和rhs參數朋友方法。有沒有人可能經歷過類似的事情或知道其他解決方案。

在此先感謝。

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

回答

4

你需要一個模板operator +因爲你是試圖添加不同類型:

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

這就是說,整個代碼看起來像一個反模式。你的「基本podtype的OOP版本」不是一個有意義的,也不是一般有用的概念。

+1

+1 「沒有意義,沒有用處」。 – 2012-04-14 12:20:32

+0

這是更多的一個實驗,而不是一個理智的,是的,我會去這個程序員地獄:)。但是,謝謝你的回答,然而這個成員變量需要公開才能工作。 – Roy 2012-04-14 12:23:27

+0

如果您使'PodObject'的朋友彼此成員,則成員變量不需要是'public':'template 朋友PodObject ;'P.S.如果你真的提供這個代碼,你只能去程序員的地獄。 – 2012-04-14 12:26:24