Тернарен оператор

Защо компилаторът не може да специализира тази функция и има ли начин да го принудите да го направи?
Грешката, която получавам:
Грешка 1 грешка C2893: Неуспешно специализиране на шаблон на функция „неизвестен тип“ Ternary::check(bool,Left,Right)'

#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;
}

person There is nothing we can do    schedule 02.10.2010    source източник
comment
@Prasoon Saurav C++03 може да се смята за подмножество на C++0x, така че вашата редакция е неподходяща, тъй като C++0x го покрива.   -  person There is nothing we can do    schedule 02.10.2010
comment
Да, но SO не е толкова светло. Ако търсите въпроси с етикет c++, SO няма да посочи този въпрос.   -  person Mike DeSimone    schedule 02.10.2010
comment
Няма грешка на decltype с g++ 4.5. Той се оплаква само от линията check_(Int2Type<condition>,left,right);.   -  person kennytm    schedule 02.10.2010
comment
@KennyTM под complians имате предвид предупреждава или дава грешка?   -  person There is nothing we can do    schedule 02.10.2010
comment
@Там: Грешки разбира се. Параметърът на шаблона трябва да бъде постоянен израз.   -  person kennytm    schedule 02.10.2010


Отговори (1)


Все още нямам достатъчно опит с C++0x, но от това, което виждам:

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

decltype очаква израз, но Result<...>::value е тип. Просто премахнете decltype;

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

condition е променлива, не можете да я използвате като параметър на шаблон.

АКТУАЛИЗАЦИЯ: също Int2Type<Condition> отново е тип. Искате да подадете стойност: Int2Type<Condition>().

person Yakov Galka    schedule 02.10.2010
comment
@ybungalobill Подобно на оператора sizeof, операндът на decltype не се оценява.[9] Неофициално, типът, върнат от decltype(e), се извежда по следния начин: [1] Ако изразът e се отнася до променлива в локален обхват или пространство от имена, статична променлива член или параметър на функция, тогава резултатът е декларираният тип на тази променлива или параметър. Ако e е извикване на функция или извикване на претоварен оператор, decltype(e) обозначава декларирания тип връщане на тази функция. В противен случай, ако e е lvalue, decltype(e) е T&, където T е видът на e; ако e е rстойност, резултатът е T - person There is nothing we can do; 02.10.2010
comment
@Там: Няма нищо общо с оценката. Граматиката казва, че нещото между скобите трябва да е израз, това което си написал там е тип. - person Yakov Galka; 02.10.2010
comment
@ybungalobill добре, разбрах. Но мога да премахна decltype - няма да се компилира - person There is nothing we can do; 02.10.2010
comment
@Там: ако не се компилира без decltype, можете да опитате да добавите typename преди резултата (и да премахнете decltype). - person Yakov Galka; 02.10.2010
comment
@ybunalobill добавянето на typename помогна. Благодаря. Сега (актуализирах публикацията си) се съобразява с check_(...); - person There is nothing we can do; 02.10.2010