2010-10-02 6 views
1

Pourquoi le compilateur ne peut pas spécialiser cette fonction et est-il possible de le forcer à le faire?
L'erreur que je reçois:
erreur 1 erreur C2893: Impossible de se spécialiser modèle de fonction '' de type inconnu 'check :: ternaires (Bool, Gauche, Droite)'
Opérateur ternaire

#include "stdafx.h" 
#include <iostream> 
#include <string> 
using std::cout; 
using std::string; 

template<int v> 
struct Int2Type 
{ 
    enum {value = v}; 
}; 

template<bool condition,class Left, class Right> 
struct Result; 


template<class Left, class Right> 
struct Result<true,Left,Right> 
{ 
    typedef Left value; 
}; 

template<class Left, class Right> 
struct Result<false,Left,Right> 
{ 
    typedef Right value; 
}; 

struct Ternary 
{ 
    template<class Left, class Right> 
    static Right check_(Int2Type<false>, Left left, Right right) 
    { 
     return right; 
    } 

    template<class Left, class Right> 
    static Left check_(Int2Type<true>, Left left, Right right) 
    { 
     return left; 
    } 


__Updated__ 
    template<bool Condition,class Left, class Right> 
static auto check(Left left, Right right)-> 
    typename Result<Condition,Left,Right>::value 
{ 
    return check_(Int2Type<Condition>,left,right); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int a = 5; 
    string s = "Hello"; 
    cout << Ternary::check<false>(a,s); 
    return 0; 
} 
+0

@Prasoon Saurav C++ 03 il peut être considéré comme un "sous-ensemble" de C++ 0x donc votre édition est inadaptée car C++ 0x le couvre. –

+5

Oui, mais SO n'est pas si brillant. Si vous recherchez des questions marquées "C++", SO ne listera pas cette question. –

+0

Quelle est l'erreur? – ybungalobill

Répondre

3

Je don « t ont assez d'expérience avec C++ 0x, mais d'après ce que je vois:

decltype(Result<(sizeof(int) == 1),Left,Right>::value) 

decltype attend une expression, mais Result<...>::value est un type. Retirez simplement le decltype;

return check_(Int2Type<condition>,left,right); 

condition est une variable, vous ne pouvez pas l'utiliser comme un paramètre de modèle.

MISE À JOUR: aussi Int2Type<Condition> est encore un type. Vous voulez transmettre une valeur: Int2Type<Condition>().

+0

@ybungalobill Comme l'opérateur sizeof, l'opérande de decltype n'est pas évaluée. [9] De manière informelle, le type renvoyé par decltype (e) est déduit comme suit: [1] Si l'expression e fait référence à une variable __variable__ dans la portée locale ou de l'espace de noms, une variable membre statique ou un paramètre de fonction, le résultat est cette variable ou le type déclaré du paramètre Si e est un appel de fonction ou un appel d'opérateur surchargé, decltype (e) indique le type de retour déclaré de cette fonction Sinon, si e est une lvalue, decltype (e) est T &, où T est le type de e; si e est un rvalue, le résultat est T –

+0

@There: Cela n'a rien à voir avec l'évaluation. ** Grammaire ** dit que la chose entre les parenthèses doit être une ** expression **, ce que vous avez écrit il y a un ** type **. – ybungalobill

+0

@ybungalobill ok l'ai eu. Mais je peux supprimer decltype - il ne compilera pas –

Questions connexes