à l'aide extern modèle (C++11)

Figure 1: les modèles de fonction

TemplHeader.h

template<typename T>
void f();

TemplCpp.cpp

template<typename T>
void f(){
   //...
}    
//explicit instantation
template void f<T>();

Main.cpp

#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
    f<char>();
    return 0;
}

Est-ce la bonne façon d'utiliser les extern template, ou dois-je utiliser ce mot-clé uniquement pour les modèles de classe comme dans la Figure 2?

Figure 2: modèles de classe

TemplHeader.h

template<typename T>
class foo {
    T f();
};

TemplCpp.cpp

template<typename T>
void foo<T>::f() {
    //...
}
//explicit instantation
template class foo<int>;

Main.cpp

#include "TemplHeader.h"
extern template class foo<int>();
int main() {
    foo<int> test;
    return 0;
}

Je sais qu'il est bon de mettre tout cela dans un fichier d'en-tête, mais si nous instancier les modèles avec les mêmes paramètres dans plusieurs fichiers, puis nous avons eu de multiples mêmes définitions et le compilateur va supprimer tous (sauf un) pour éviter les erreurs. Comment puis-je utiliser extern template? Pouvons-nous l'utiliser uniquement pour les classes, ou pouvons-nous l'utiliser pour les fonctions de trop?

Aussi, la Figure 1 et la Figure 2 peut être étendu à une solution où les modèles sont dans un seul fichier d'en-tête . Dans ce cas, nous devons utiliser la extern template mot-clé pour éviter les multiples d'un même instantations. Est-ce que pour des classes ou des fonctions trop?

Ce n'est pas la bonne utilisation des extern modèles à tous... ce n'est même pas compiler
Pourriez-vous prendre le temps de la phrase (une) question plus clairement? De quoi êtes-vous poster le code? Je ne vois pas une question. Aussi, extern template class foo<int>(); semble être une erreur.
il compile très bien sur mon visual studio 2010, sauf le message d'avertissement:Avertissement 1 avertissement C4231: extension non standard utilisé : 'extern' avant du modèle d'instanciation explicite
la question est très simple: comment et quand utiliser extern modèle de mot-clé? (extern modèle est le C++0x nouvel avenir btw) vous avez dit "Aussi, extern modèle de la classe foo<int>(); ça semble être une erreur." non, ce n'est pas, j'ai de nouveau C++ livre et que l'exemple de mon livre.
visual studio est vraiment stupide.. dans le second, le prototype ne correspond pas à la mise en œuvre, et même si je régler ce problème, il dit "attend unqualified-id' près de () sur la extern ligne. à la fois votre livre et visual studio sont mauvais, essayez d'utiliser plus conforme à la norme compilateur comme g++ ou clang et vous verrez le problème.

OriginalL'auteur codekiddy | 2011-11-15