Почему этот вложенный шаблон вычитает неудачу? - PullRequest
0 голосов
/ 17 апреля 2020

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

template<typename T = int>
struct A {
    T v;
};

int main()
{
    A k;
    static_assert(std::is_same_v<decltype(k.v), int>);
}

Этот код компилируется без проблем, и k.v будет иметь тип int, поскольку он определен как тип аргумента шаблона по умолчанию. Теперь этот код:

template<typename T = int>
struct A {
    T v;
};

struct B {
    A a;
};

int main()
{
    A k;
    static_assert(std::is_same_v<decltype(k.v), int>);
}

Этот код выдает ошибку компиляции для B. Потому что кажется, что выведение аргумента недопустимо в элементе не-stati c struct. Но я не понимаю почему. Поскольку шаблон AAA имеет тип по умолчанию, он может легко рассматривать элемент A в структуре B как A<int>. Мне нравится знать, почему этого не происходит. Есть идеи?

1 Ответ

3 голосов
/ 17 апреля 2020

Этот фрагмент кода:

struct B {
    A a;
};

выдает ошибку:

invalid use of template-name 'A' without an argument list

Это потому, что A является шаблоном, и, следовательно, компилятор требует, чтобы вы использовали его как таковой , Это верно, даже если A имеет аргумент по умолчанию; вам все еще нужно использовать <> для обозначения того, что вы используете шаблон.

Так что этот фрагмент кода:

struct B {
    A<> a;   // note the <>
};

будет скомпилирован очень хорошо.

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

struct B {
  auto a = 0;  // error
}

См. это вопрос и ответ для более подробной информации.

...