2010-10-23 27 views
3

Puis-je appeler une fonction templated statique non-membre d'une fonction de membre statique où la définition est divisée en-tête et cpp:Définitions de méthodes basées sur des modèles statiques non membres en C++?

// zero.cpp 

class Zero 
{ 
    static void zero() { one(5); } 
}; 

// one.h 

template <typename T> 
static void one(T& var); 

// one.cpp 

template <typename T> 
void one(T& var) { } 

// main.cpp 

... 

Zero::zero() 

... 

Je vais avoir des problèmes pour faire cela lien, je continue à faire référence non définie à la fonction que j'essaie de définir dans one.cpp. Initialement, je pensais que c'était dû à un problème avec l'espace de noms, mais tous les fichiers sont maintenant dans le même espace de noms. Est-ce que je fais quelque chose de fondamentalement mauvais ici?

+0

Ceci est un doublon un million de fois, mais SO est terrible à trouver des choses. Stupide recherche SO. – GManNickG

Répondre

4

Les définitions de modèle doivent être visibles au moment de l'instanciation. À savoir, il doit être dans l'en-tête d'une certaine manière:

// one.hpp 

template <typename T> 
static void one(T& var) 
{ 
    // definition visible in header 
} 

Bien que je ne suis pas sûr pourquoi vous voulez qu'il soit statique.

+0

Bien sûr que oui, je suis toujours confus avec ça. Je peux transférer une fonction template dans un en-tête, à condition que la définition soit toujours disponible dans un autre fichier d'en-tête. Et vous avez raison, aucune raison d'être statique dans ce cas. – Dan

2

En complément à la réponse de GMan Je voudrais noter que vous ne pouvez pas T& lier à un rvalue comme le 5 littéral intégral qui est de type int. 5 ne se liera pas à int&, mais se liera à const int&.