2010-06-14 14 views
1

A partir de la réponse de STH à cette question:multiples erreur de définition C de

Je me demandais comment résoudre les multiples erreurs de définition si le code suivant est placé dans un fichier d'en-tête inclus plusieurs fois par différents fichiers .cc et liés entre eux:

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; 

Répondre

2

Déplacez la spécialisation dans l'un des .cc f iles. Laissez la version du modèle dans l'en-tête.

+0

Comment cela fonctionnerait-il? Et si j'avais besoin des spécialisations dans plusieurs fichiers .cc? Ensuite, je reçois une erreur lorsque je lier plusieurs fichiers .cc avec les mêmes définitions. – user231536

+0

@ user231536: Si vous écrivez une définition classe normale vous fournir des méthodes que dans un seul .cc, éditeur de liens permet de les utiliser du reste des fichiers .cc. La même chose pour les spécialisations complètes. Vous fournissez la spécialisation seulement dans un dossier de .cc, l'éditeur de liens s'assure que d'autres dossiers de .cc peuvent l'employer. – Paul

0

Selon la plate-forme, vous pouvez entourer par un #ifdef ou quelque chose comme #pragma une fois

0

La seule chose que je peux penser est que vous définissez la variable K pour tous les types avant une spécialisation, et donc quand le compilateur arriverait à la spécialisation <int>, la définition de la variable existerait déjà ..

donc, si tel est le cas, vous aurez envie de déplacer la spécialisation pour C<int>::K à avant C<T>::K