2011-08-01 8 views
0

は私が持っていると言うことができます異なる結果を取得します(このクラスはOKです)C++生またはスマートポインタとテンプレート関数の作成が

class CCheckSystemEndianess 
{ 
private: 
    int i; 
    char checker[sizeof(int)]; 
public: 
    CCheckSystemEndianess() : i(1) { } 
    bool isLittleEndian() { return (checker[0] != 0); } 
}; 

しかし、この1は、主な問題があることである

template <bool checker> 
class CEndian 
{ 
private: 
    template <typename T> 
    T swapEndianess (const T& value) 
    { 
     if (CCheckSystemEndianess().isLittleEndian() == checker) 
     { 
      return value; 
     } 
................. 

奇妙な行為します私がCCndSystemEndianess()で異なる結果を得る方法をCEndianで作成すると、isLittleEndian()

のようになります。

CEndian<false> *p_endian = new CEndian<false>(); 

は、この行は

CcheckSystemEndianess().isLittleEndian() = false 

になります。しかし、私はこの

std::unique_ptr<CEndian<false> > p_endian (new Cendian<false>()); 

ようCEndianを作成する場合は、この行は CcheckSystemEndianess()となります。isLittleEndian()が真=。

そして、私はCEndianクラス内CCheckSystemEndianesを作成する場合は[はい、すべてがOK

template <typename T> 
T swapEndianess (const T& value) 
{ 
    std::unique_ptr<CCheckSystemEndianess> endianCheck(newCCheckSystemEndianess); 

checkSystemEndianess(行く)。isLittleEndian()スマートと生のポインタが真なるとの両方の方法が....

私はそこに少し混乱しました..

編集: CCheckSystemEndianessはクラスではないことを指摘してくれたCubbiに感謝します。

答えて

2

CCheckSystemEndianessでは、iおよびcheckerは2つの無関係なオブジェクトです。コンストラクタによってはiに書き込まれ、checkerの内容は未初期化のままです。

あなたの意図はおそらく組合を作ることでしたか?

+0

実際にはいです。私は組合について考えていたが、クラスを作った。 – legion

+0

これをコンストラクタと組み合わせることもできます... – dascandy