2010-05-28 10 views
2

ce qui suit me donne une instanciation de modèle ambigu avec nvcc (combinaison d'EDG front-end et g ++). Est-ce vraiment ambigu ou le compilateur est-il mauvais? Je posterai aussi la solution à boost :: enable_ifC++ instanciation de modèle ambigu

template<typename T> struct disable_if_serial { typedef void type; }; 
template<> struct disable_if_serial<serial_tag> { }; 

template<int M, int N, typename T> 
__device__ 
//static typename disable_if_serial<T>::type 
void add_evaluate_polynomial1(double *R, 
         const double (&C)[M][N], double x, 
         const T &thread) { 
    // ... 
} 

template<size_t M, size_t N> 
__device__ 
static void add_evaluate_polynomial1(double *R, 
            const double (&C)[M][N], double x, 
            const serial_tag&) { 
    for (size_t i = 0; i < M; ++i) 
     add_evaluate_polynomial1(R, C, x, i); 
} 

// ambiguous template instantiation here. 
add_evaluate_polynomial1(R, C, x, serial_tag()); 
+0

J'ai testé votre code sur Clang et GCC. Les deux l'acceptent. Donc, je soupçonne un bug dans Comeau. –

+1

@Johannes merci, en fait il y avait un problème de ma part, les paramètres 'int' et' size_t 'cause l'ambiguïté, comme l'a souligné @jpa. G ++ a également accepté ce modèle sur mon système sans se plaindre. – Anycorn

Répondre

5

AFAIK, le problème est que vous avez les arguments non typiques tapées incohérente (qui est, M et N sont int ici, mais il size_t). Cela signifie que toutes les affectations de variables de template de l'une ne peuvent pas être utilisées dans l'autre, ce qui signifie qu'il n'y a pas d'ordre partiel, d'où le message d'erreur. Unissez les types d'argument type non typé et cela devrait fonctionner.

+0

merci. Ce n'est pas la première fois que j'ai fait cette erreur stupide particulière – Anycorn

3

J'ai testé le code sur Clang, GCC et Comeau. Comeau le rejette tandis que GCC et Clang l'acceptent. Je pense que pour les deux groupes de compilateurs on peut les points

fait
  • Comeau suit la règle 03 C++, ce qui nécessite une « correspondance exacte (de sorte que la déduction ne repose pas sur les conversions implicites) » pour le déduire arguments de modèle. Cependant cette spécification était horribly underspecified et a été complètement réécrite pour C++ 0x. Clang et GCC semblent mettre en œuvre la règle réécrite, et cette règle précise mieux ce que signifie "correspondance exacte". Cette spécification va bien avec les différents types de dimensions du tableau.

Dans tous les cas, si vous voulez aller bien avec tous les compilateurs, puis allez vraiment par la réponse acceptée et changer les types de paramètres non de type à un type commun :)

+0

merci. Je suis allé de l'avant et résoudre ce problème, maintenant les deux compilateurs et heureux – Anycorn

Questions connexes