Ошибка множественного определения С++

Начиная с ответа sth на этот вопрос:

Мне было интересно, как устранить несколько ошибок определения, если следующий код помещен в файл заголовка, включенный несколько раз в разные файлы .cc и связанный вместе:

template <typename T>
class C {
   static const int K;
   static ostream& print(ostream& os, const T& t) { return os << t;}
};

// general case
template <typename T>
const int C<T>::K = 1;

// specialization
template <>
const int C<int>::K = 2;

person user231536    schedule 14.06.2010    source источник


Ответы (3)


Переместите специализацию в один из файлов .cc. Оставьте версию шаблона в шапке.

person Paul    schedule 14.06.2010
comment
Как это будет работать? Что делать, если мне нужны специализации в нескольких файлах .cc? Затем я получаю сообщение об ошибке, когда связываю несколько файлов .cc с одинаковыми определениями. - person user231536; 14.06.2010
comment
@ user231536: Если вы пишете обычный класс, вы предоставляете определения методов только в одном .cc, компоновщик позволяет использовать их из остальных файлов .cc. То же самое работает для полных специализаций. Вы предоставляете специализацию только в одном файле .cc, компоновщик гарантирует, что другие файлы .cc могут использовать его. - person Paul; 14.06.2010

В зависимости от платформы вы можете окружить его #ifdef или что-то вроде #pragma один раз.

person Daryl    schedule 14.06.2010

Единственное, что я могу придумать, это то, что вы определяете переменную K для всех типов до какой-либо специализации, поэтому, когда компилятор доберется до специализации <int>, определение переменной уже будет существовать.

Итак, если это так, вам нужно переместить специализацию для C<int>::K до C<T>::K.

person ianmac45    schedule 14.06.2010