2011-08-01 2 views
0

내가이 말을하자 다른 결과를 가져옵니다 (이 클래스는 OK입니다)C++ 원시 또는 스마트 포인터 템플릿 함수 생성

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

하지만이 사람은 주요 문제가 있다는 것입니다

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

이상한 역할 CEndian을 여러 가지 방법으로 만들면 CCheckSystemEndianess()를 사용하여 다른 결과를 얻습니다. isLittleEndian()

예 :

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

다음이 라인은

CcheckSystemEndianess().isLittleEndian() = false 

된다하지만이

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

같은 CEndian를 만드는 경우 다음이 라인은 CcheckSystemEndianess()가된다. isLittleEndian()가 true =.

내가 CCheckSystemEndianes을 작성하는 경우 예 CEndian 클래스의 모든 간다 내부 확인을

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

checkSystemEndianess(). isLittleEndian() 스마트와 원시 포인터가 사실 ....

내가 도착과 함께 두 가지 거기에 조금 혼란스러워.

편집 : CCheckSystemEndianess는 클래스가 아닌 조합이어야한다는 Cubbi에게 감사드립니다.

답변

2

CCheckSystemEndianess에서 ichecker은 관련이없는 두 개체입니다. 생성자가 을 i에 쓰는 것은 초기화되지 않은 채로있는 checker의 내용과는 관련이 없습니다.

아마 당신의 의도는 노동 조합을 만드는 것이 었습니다.

+0

사실 예. 나는 노동 조합에 대해 생각하고 있었지만 수업을 만들었습니다. – legion

+0

당신은 그것도 생성자와 노동 조합을 만들 수 있습니다 ... – dascandy