2012-04-14 3 views
1

以下の例では、基本的なpodtypeコンテナクラスを定義しています。このクラスを使用して、基本ポッドタイプのOOPバージョンを表す一連のtypedefが作成されます。この問題は、それらのタイプを互いに割り当てることから始まります。異なるタイプのC++テンプレート演算子オーバーロード

普通の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){ 

EDIT:

下記の友人の方法は、私のために仕事をしていません:

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

全体のコードはアンチパターンのように見える、言った:異なるタイプを追加しようとしています。あなたの "基本的なポッドタイプのOOPバージョン"は意味がある、または一般的に有用な概念ではありません。

+1

「意味がない、役に立たない」の場合+1。 –

+0

これは、何か問題があるというよりむしろ実験のほうが多く、はい、私はプログラマの地獄に行くでしょう:)。しかし、答えをいただきありがとうございます、しかし、メンバー変数は、これが動作するためには公開される必要があります。 – Roy

+0

'PodObject'のお友達同士をお互いに作る場合、メンバー変数は' public'である必要はありません: 'template friend PodObject ;' P.S.実際にこのコードを提供するのであれば、プログラマーの地獄に行くだけです。 –

関連する問題