Я хочу переслать объявление переменных шаблонов в файл заголовка, а затем иметь фактические экземпляры в отдельном блоке компиляции.Невозможно объявить переменную шаблона без его определения
Мне повезло, что переменные шаблоны C++ 14 действовали очень как статические переменные класса. К сожалению, это, похоже, не совсем так, и это мешает мне переслать объявление переменных.
template <typename T> struct Variable {
static int variable;
};
template <typename T>
extern int variable;
int main() {
(void) Variable<char>::variable;
// (void) variable<char>; // <-- line 10
}
template <> int Variable<char>::variable = 42;
template <> int variable<char> = 23;
Образец, приведенный выше, компилируется и запускается как-находится под GCC. Но недопустимая строка 10 дает ошибку времени компиляции:
specialization of 'variable<char>' after instantiation
template <> int variable<char> = 23;
^
Clang отклоняет оба. Это плохо сформированный НДР. Явная * инстанция * и явная * специализация * - совершенно разные звери. –
Все в порядке - так как * do * Я выполняю то, что хочу, - чтобы объявить переменную в заголовке, но определить ее в .cpp? –