Значение шаблонов `defValue 'не может появляться в выражении константы - PullRequest
3 голосов
/ 02 октября 2010

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

`defValue' cannot appear in a constant-
 expression

Может кто-нибудь, пожалуйста, в чем проблема и как это можно исправить?

#include <iostream>
template <class T,T defaultVal, int dim=255>
class Vec
{
    T _vec[dim];
    int _dim;
    public:
    Vec () : _dim(dim)
    {
       for (int i=0;i<_dim;++i)
       {
         _vec[i] = defaultVal;
       }
    }
    ~Vec () {};
// other operators and stuff
};

int main ()
{
    int defValue = 0;
    Vec < int,defValue > vecWithDefVal;// here is the problem but i don't know why
}

Ответы [ 2 ]

1 голос
/ 02 октября 2010

С ++ 03 14.3.2

Шаблонные нетиповые аргументы

Аргумент шаблона для нетипичного, не шаблонного параметра шаблона должен быть одним из:

- целочисленная константа-выражение целочисленного или перечислительного типа; или

- имя нетипового шаблона-параметра; или

- адрес объекта или функции с внешней связью, включая шаблоны функций и функции шаблоны-идентификаторы, но исключая нестатические члены класса, выраженные как & id-выражение, где & есть необязательный, если имя ссылается на функцию или массив, или если соответствующий параметр шаблона является ссылкой; или же - указатель на член, выраженный как описано в 5.3.1.

defValue [являющийся аргументом нетипичного типа], не является ни тем, ни другим.

Измените int defValue = 0; на const int defValue = 0 и ваш код скомпилируется [см. Первое условие].

или прямо напишите Vec <int,0> vecWithDefVal;

1 голос
/ 02 октября 2010

Шаблоны могут параметризоваться только типами и константами времени компиляции базовых типов. Так что Vec < int,0 > vecWithDefVal; будет в порядке.

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