Параметры по умолчанию для шаблонов структуры - PullRequest
1 голос
/ 21 января 2010

У меня есть шаблон struct tree_parse_info, объявленный следующим образом:

template <
    typename IteratorT,
    typename NodeFactoryT,
    typename T
>
struct tree_parse_info 
{
  // ...
};

Компилятор допускает следующий код:

tree_parse_info<> m_info;

Почему этот код компилируется, хотя у нас нет значения по умолчаниюпараметры шаблона для шаблона struct tree_parse_info?

Ответы [ 2 ]

5 голосов
/ 21 января 2010

Если класс был предварительно объявлен ранее, вам не нужно будет пересчитывать параметры по умолчанию. Например:

// forward declare only
template <typename T = int, size_t N = 10>
struct array;

// actual definition
template <typename T , size_t N>
struct array
{};

int main(void)
{
    array<> a; // uses the defaults it saw in the forward-declaration
}

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

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

template <typename T = int, size_t N = 10>
struct array;

// error: redefinition of default parameter
template <typename T = double , size_t N = 2>
struct array
{};

Попробуйте указать код, который вы нам показали, который по умолчанию не может совпадать, например:

struct stupid_special_tag_type_lolroflwat {};

template <
    typename IteratorT = stupid_special_tag_type_lolroflwat,
    typename NodeFactoryT = stupid_special_tag_type_lolroflwat,
    typename T = stupid_special_tag_type_lolroflwat
>
struct tree_parse_info 
{
  // ...
};

Если вы получаете ошибки переопределения, вы знаете, что в других местах указаны значения по умолчанию.

3 голосов
/ 21 января 2010

Когда я компилирую ваш код с помощью g ++, я получаю следующую ошибку:

tp.cpp: 10: ошибка: неправильный номер аргументы шаблона (0, должно быть 3)

То есть вы должны компилировать что-то, кроме кода, который вы нам показываете.

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