2010-01-21 8 views
1

J'ai tree_parse_info un struct modèle déclaré comme suit:paramètres par défaut des modèles struct

template < 
    typename IteratorT, 
    typename NodeFactoryT, 
    typename T 
> 
struct tree_parse_info 
{ 
    // ... 
}; 

Le compilateur permet le suit le code:

tree_parse_info<> m_info; 

Pourquoi ce code ne compile même si nous n'avons pas paramètres de modèle par défaut pour le struct struct tree_parse_info?

+0

Il ne compile pas. Postez le code réel. –

+0

Si vous avez trouvé ma réponse utile, veuillez l'upvoter et/ou l'accepter :) (Accepter en cliquant sur la flèche verte.) De plus, vous pouvez simplement commenter ma réponse au lieu d'en poster une nouvelle. – GManNickG

Répondre

3

Lorsque je compile votre code avec g ++, je reçois l'erreur suivante:

tp.cpp:10: error: wrong number of template arguments (0, should be 3)

Vous devez donc être autre chose que compiler le code que vous nous montrez.

+0

Même chose pour MSVC: C2976: 'tree_parse_info': trop peu d'arguments de modèle –

+0

Même chose pour Intel: 'trop peu d'arguments pour le modèle de classe 'tree_parse_info'' –

5

Si la classe a été déclarée avant, vous n'aurez pas besoin de redéfinir les paramètres par défaut. Par exemple:

// forward declare only 
template <typename T = int, size_t N = 10> 
struct array; 

// actual definition 
template <typename T , size_t N> 
struct array 
{}; 

int main(void) 
{ 
    array<> a; // uses the defaults it saw in the forward-declaration 
} 

Regardez au-dessus de votre définition pour voir si vous l'avez déclaré.

Par ailleurs, si vous donnez les valeurs par défaut à un endroit, et les défauts différents à un autre, vous obtiendrez une erreur de compilation:

template <typename T = int, size_t N = 10> 
struct array; 

// error: redefinition of default parameter 
template <typename T = double , size_t N = 2> 
struct array 
{}; 

Essayez de donner le code que vous nous avez montré par défaut qui ne peuvent peut-être correspondre accidentellement, comme:

struct stupid_special_tag_type_lolroflwat {}; 

template < 
    typename IteratorT = stupid_special_tag_type_lolroflwat, 
    typename NodeFactoryT = stupid_special_tag_type_lolroflwat, 
    typename T = stupid_special_tag_type_lolroflwat 
> 
struct tree_parse_info 
{ 
    // ... 
}; 

Si vous obtenez des erreurs de redéfinition, vous savez que vous l'avez donné par défaut dans un autre emplacement.

+0

Sa question dit qu'il n'a pas de paramètres par défaut. –

+0

@Neil: Peut-être qu'il y en a un au-dessus de sa définition actuelle, dans une déclaration forward. Ce n'est qu'une supposition, certes. – GManNickG

Questions connexes