Шаблоны и const на С ++ - PullRequest
       14

Шаблоны и const на С ++

3 голосов
/ 13 февраля 2012

У меня есть следующий шаблон:

#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; 
}

Но программа не будет компилироваться, потому что значение шаблона должно быть известно во время компиляции, то есть const или const-literal.

Я действительно не понимаю эту ошибку, кто-нибудь может мне ее объяснить?

Ответы [ 4 ]

4 голосов
/ 13 февраля 2012

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

1 голос
/ 13 февраля 2012

Как правило, использование разных типов для каждого значения, которое вы хотите использовать, не так уж полезно.В большинстве случаев я ожидаю, что вы захотите использовать T() в качестве значения по умолчанию по умолчанию (нет, дубликат «default» не является типом) с возможностью переопределения значения по умолчанию объекта, используя параметр конструктора.Использование аргумента шаблона для значения по умолчанию не работает, если вы хотите определить значение во время выполнения.

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

int const defValue = 0;

Чтобы иметь дело с нецелыми типами, вы можете рассмотреть возможность использования указателя или ссылки на объект в области пространства имен.Тем не менее, я думаю, что использование параметра конструктора - это то, что действительно нужно здесь.

1 голос
/ 13 февраля 2012

Как сказал вам компилятор, это должно быть константное выражение.

Использовать const int defValue = 0;

0 голосов
/ 13 февраля 2012
const int defValue = 0;
Vec<int, defValue> vecWithDefVal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...