Ошибка компоновщика с переменными шаблонами

Рассмотрим код ниже:

#include <iostream>

template<typename T>
T n;

int main()
{
n<int> = 42;
std::cout << n<int> << std::endl;
}

Это компилирует и связывает с g ++ 5.1, и это отображает 42, Тем не менее, лязг ++ не может связать это:

неопределенная ссылка на n<ИНТ>

Если я инициализирую переменную шаблона как

template<typename T> T n{};

затем Clang ++ связывает это тоже.

Есть идеи, что происходит? Является ли clang ++ «правильным» при невозможности связать программу? И почему это работает, если я инициализирую переменную шаблона?

Насколько я знаю, переменные шаблона являются просто синтаксическим сахаром для обертки шаблона вокруг статических членов, поэтому n<int> = 42 эффективно специализируется на int пример. ИМО, код должен ссылаться.

11

Решение

Это ошибка в Clang ++ # 22825. Отчет об ошибке был подан 2015-03-06, и ошибка еще не исправлена. Ричард Смит предполагает, что это определение неправильно трактуется только как предварительное заявление.

6

Другие решения


По вопросам рекламы [email protected]