2017-08-27 2 views
1

Je suis vraiment honte de poser cette question, mais il semble que je ne sais pas quoi que ce soit sur les modèles après tout.Définition hors-ligne de constructeur dans le modèle entièrement spécialisé

Je cet extrait:

template <typename> class foo; 
class bar; 

template <> class foo <bar> 
{ 
public: 
    foo(); 
}; 

template <> foo <bar> :: foo() 
{ 
} 

Où, eh bien, je viens d'une classe de modèle foo, une classe bar, une spécialisation foo <bar> avec un constructeur, et je voudrais définir ce constructeur sur ligne.

Aussi trivial que cet exemple puisse ressembler, je ne peux pas l'obtenir pour compiler, et je reçois toujours No function template matches function template specialization 'foo'.

Si j'ajoute un paramètre fictif afin que le modèle ne soit pas entièrement spécialisé (par exemple, template <bool dummy> foo <bar, dummy> :: foo()), cela fonctionne bien. Qu'est-ce que je rate?

+1

'template <> foo :: foo()' -> 'foo :: foo()'. Vous ne spécialisez rien, vous définissez une entité précédemment déclarée. – StoryTeller

+0

D'oh. Cela a du sens. Merci. –

Répondre

1

Les membres d'une spécialisation de modèle de classe complète peuvent être définis à l'aide de la syntaxe de définition de membre ordinaire. Ce n'est pas une définition pour le modèle, donc le préfixe template<> ne peut pas être spécifié.

il suffit de changer à

foo <bar> :: foo() 
{ 
}