使用原始或智能指针创建C ++模板函数会得到不同的结果

时间:2011-08-01 14:27:57

标签: c++ class templates

让我说:(这个课还可以)

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 

但是如果我像这样创建CEndian

std::unique_ptr<CEndian<false> > p_endian (new Cendian<false>());
然后这条线就变成了     CcheckSystemEndianess()。isLittleEndian()= true。

是的如果我在CEndian类中创建CCheckSystemEndianes一切顺利

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

checkSystemEndianess()。isLittleEndian()智能和原始指针的两种方式都是真的....

我有点困惑......

编辑: 感谢Cubbi指出CCheckSystemEndianess必须是union而不是class。

1 个答案:

答案 0 :(得分:2)

在CCheckSystemEndianess中,ichecker是两个不相关的对象。构造函数写入1的值ichecker的内容无关,这些内容仍然未初始化。

也许你的意图是建立一个联盟?