Я не уверен, что вы подразумеваете под «инициализацией типа внутри cpp, создаст ошибку компоновщика». но предполагая, что вы на самом деле означаете , определяющий, тогда вы, должно быть, сделали что-то неправильно, потому что определение статического члена для каждого типа в соответствующем месте, безусловно, работает! То, что у вас есть в шаблоне класса - это объявление объекта, и это нужно определить где-нибудь, если он когда-либо ссылался. Только если MyType
является интегральным типом, вы инициализируете его в своем классе [template], и вам никогда не нужен его адрес (например, привяжите его к постоянной ссылке или возьмите его адрес), вы уйдете, не определяя его. Это потому, что в этом случае он всегда рассматривается как постоянное выражение.
Я предполагаю, что вы пытались определить свой объект что-то вроде этого в некоторых 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;
}
BTW, I» m довольно уверен, что на этот вопрос был дан ответ, определенно в comp.lang.c++.moderated.
«Инициализация типа внутри заголовка приведет к его инициализации несколько раз». Не могли бы вы привести пример того, как вы это делаете? Если вы просто проверяете, вызван ли конструктор более одного раза, его следует вызывать более одного раза, потому что у вас есть один экземпляр для экземпляра класса. – hvd