Почему эта конструкция шаблона C ++ не сопровождается назначением? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть шаблон C ++, который определяет дюжину случаев для разных типов. В этом упрощенном примере я пытаюсь понять, почему я не могу создать класс шаблона и затем назначить ему одну и ту же строку:

// No problem
PrefShort test1(1);
test1 = 99;

// Also no problem -- although will generate compiler warnings
PrefShort(1) = 99;

// no problem -- will NOT generate compiler warnings
(PrefShort(1)) = 99;

// COMPILE ERROR: "Expected ';' at end of declaration
PrefShort test2(1) = 99;

Вот упрощенная версия шаблона в файле заголовка , который наследуется от базового класса:

enum EPrefType
{
    kPrefTypeString,
    kPrefTypeBool,
    kPrefTypeShort
};

class BasePreference
{
public:
    BasePreference(int whichPrefIndex) { fMyPrefIndex = whichPrefIndex; }
    virtual ~BasePreference() { }

protected:
    int fMyPrefIndex;
};


template<class T, EPrefType prefType>
class TPreference : public BasePreference
{
public:
    TPreference(int whichPrefIndex) :  BasePreference(whichPrefIndex) { }

    // assignment FROM T
    TPreference& operator= ( T const& inData )  { fPrefData = inData; return *this; }

private:
    T fPrefData;
};


// PrefShort
typedef TPreference<short int, kPrefTypeShort> PrefShort;

Что мне не хватает?

Ответы [ 3 ]

2 голосов
/ 11 марта 2020

Для этого просто нет синтаксиса, вот и все.

Вы можете иметь декларативное утверждение или другое выражение или выражение другого типа. Объявление просто нельзя объединить с операциями над объявленным объектом.

Можем ли мы ввести для этого синтаксис в язык? Конечно, наверное. Но это усложнит правила и ничего не даст нам. Код, который инициализирует, затем немедленно присваивает, вероятно, должен был быть правильно инициализирован для начала.

Ваш контрпример int x = 99 не честен, потому что = вводит в заблуждение: вы на самом деле просто делаете объявление с инициализацией, не присвоение. Это [своего рода] эквивалент int x(99);, с синтаксисом =, по существу, сохраненным для совместимости с C. И вы можете иметь только один инициализатор.

2 голосов
/ 11 марта 2020

Это декларация. Затем следует оператор.

PrefShort test1(1);      // declaration:   Type VarName{constructor parm}
test1 = 99;              // statement => Expression => Assignment Expression

Следующие два являются операторами.

PrefShort(1) = 99;       // Statement. 
                         // Creating a temporary object by calling a constructor
                         // Then assigns assigning the value 99 to that object
(PrefShort(1)) = 99;     // Same as previous.

Это просто неверный синтаксис:

PrefShort test2(1) = 99;  // There is not syntax that allows this.
                          // Its a sort of mangled declaration with extra
                          // stuff on the end.
1 голос
/ 11 марта 2020

Это не имеет ничего общего с шаблоном, просто синтаксис неверен,

struct A
{
    int _x;
    A(int x)  : _x(x) {}
    A& operator=(int x) { _x = x; return *this; }
};


int main()
{   
    A a(1); // valid 
    a = 3;  // valid 
    A b(2) =2;
}

Повторяет ту же проблему (см. здесь ).

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