Создание шаблонной функции C ++ с необработанным или умным указателем дает разные результаты - PullRequest
0 голосов
/ 01 августа 2011

Допустим, у меня есть: (этот класс в порядке)

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.

И да Если я создаю CCheckSystemEndianes внутри класса CEndian, все идет хорошо

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

checkSystemEndianess () .isLittleEndian () оба способа с умным и с необработанным указателем становятся правдой ....

Я немного запутался там ..

Редактировать: Спасибо Cubbi за указание на то, что CCheckSystemEndianess имеетбыть союзом, а не классом.

1 Ответ

2 голосов
/ 01 августа 2011

В CCheckSystemEndianess i и checker являются двумя не связанными объектами. Значение 1, записанное конструктору i, не имеет отношения к содержимому checker, которое остается неинициализированным.

Возможно, вы намеревались заключить союз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...