Как объявить константу, которая используется в шаблоне? - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть шаблон, который зависит от константы, которая находится в заголовке.Примерно так:

  1. Заголовок, который определяет константу:

    // header1.hpp
    const int CONST_VALUE1 = 10;
    
  2. Заголовок, где у меня есть шаблон:

    // header2.hpp
    extern const int CONST_VALUE2;
    
    template< int N >
    struct A
    {
    };
    struct B
    {
      // some member functions
      A< CONST_VALUE2 > a;
    };
    
  3. источник с определением B и константой

    // source2.hpp
    #include "header2.hpp"
    // implementation of B
    const int CONST_VALUE2 = CONST_VALUE1;
    

Это, конечно, не работает.Ошибка такая:

error: the value of 'CONST_VALUE2' is not usable in a constant expression
note: 'CONST_VALUE2' was not initialized with a constant expression
note: in template argument for type 'int'

Есть ли обходной путь?Или я должен включить header1.hpp в header2.hpp?

Ответы [ 4 ]

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

Для шаблона требуется постоянное выражение для нетипичного параметра. За переменная const для использования в константном выражении, ее инициализация должна быть видимой для компилятора. Так что вы, вероятно, включить header1.hpp в header2.hpp.

0 голосов
/ 14 марта 2014

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

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

0 голосов
/ 22 февраля 2012

Этот ответ говорит о том, что extern const не будет работать.

Тем не менее, я обошел вокруг:

  1. измените header2.hpp для определения константы:

    const int CONST_VALUE2 = 10;
    
  2. изменить исходный файл для проверки константы:

    #include "header2.hpp"
    // implementation of B
    static_assert( CONST_VALUE2 == CONST_VALUE1, "check the constant!" );
    

Таким образом, header2.hpp не должен включать header1.hpp (он необходим только в исходном файле).

0 голосов
/ 22 февраля 2012

header1 должен быть виден header2. Шаблонный класс не знает, как создавать себя, если у него нет всех определений.

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