C ++ множественная ошибка определения - PullRequest
1 голос
/ 14 июня 2010

Начиная с ответа 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;

Ответы [ 3 ]

2 голосов
/ 14 июня 2010

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

0 голосов
/ 14 июня 2010

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

Так что, если это так, вы захотите перенести специализацию для C<int>::K до C<T>::K

0 голосов
/ 14 июня 2010

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

...