Я не уверен, что вы подразумеваете под "инициализация Type внутри cpp приведет к ошибке компоновщика". но если предположить, что вы на самом деле имеете в виду определение , то вы, должно быть, сделали что-то не так, потому что определение статического члена для каждого типа в соответствующем месте определенно работает! В вашем шаблоне класса есть объявление объекта, и его нужно где-то определить, если на него когда-либо ссылаются. Только если MyType
окажется целочисленным типом, вы инициализируете его в своем классе [шаблоне], и вам никогда не понадобится его адрес (например, привязываете его к постоянной ссылке или берете его адрес), вам не удастся определить его. Это потому, что в этом случае оно всегда рассматривается как константное выражение.
Я предполагаю, что вы пытались определить свой объект примерно так в каком-то файле cpp:
template <typename T> MyType const MyClass<T>::Type = some-initialization-here;
Это не будет работать, если вы не создадите это определение явно или неявно в одной и той же единице перевода. Вы можете определить член для определенного типа примерно так:
template <> MyType const MyClass<T>::Type = some-initialization-here;
Если вам действительно не нужно, чтобы тип был константным выражением, в этом случае вы, как правило, можете обойти проблему, если необходимо, сделав ее enum
(это то, что я склонен делать, потому что этот парень может быть связан с const
ссылка, не требующая определения), вы можете использовать статическую функцию-член, которая может быть определена в заголовке вместо:
template <typename T>
MyType const& MyClass<T>::Type() {
static MyType rc = some-initialization-here;
return rc;
}
Кстати, я почти уверен, что на этот вопрос уже был дан ответ, определенно в comp.lang.c ++. Moderated .