Получение логического значения из true_type / false_type typedef из зависимого класса в enable_if - PullRequest
3 голосов
/ 07 октября 2011

У меня есть класс

template <typename T>
struct Trait { typedef std::false_type IsGood; };

template <>
struct Trait<int> { typedef std::true_type IsGood; };

Вызов, подобный этому, не компилируется в MSVC 2010

template <typename T, typename Enable = void> class Foo;

template <typename T>
class Foo <T, std::enable_if<typename Trait<T>::IsGood::value>::type>
{};

// This fails as well
template <typename T>
class Foo <T, typename std::enable_if<Trait<T>::IsGood::value>::type>
{};

// And this fails horribly
template <typename T>
class Foo <T, typename std::enable_if<typename Trait<T>::IsGood::value>::type>
{};

, а

template <typename T>
class Foo <T, typename std::enable_if<std::is_same<std::true_type, 
    typename Trait<T>::IsGood>::value>::type>
{};

работает - почему?

Сообщение об ошибке:

main.cpp(12): error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test>'
          with
          [
              _Test=false
          ]
main.cpp(12): error C2146: syntax error : missing ',' before identifier 'type'
main.cpp(12): error C2065: 'type' : undeclared identifier
main.cpp(13): error C2976: 'Foo' : too few template arguments

1 Ответ

4 голосов
/ 07 октября 2011

Вы используете typename в неправильном месте.Это правильно:

template <typename T>
class Foo <T, typename std::enable_if<Trait<T>::IsGood::value>::type>
{};        // ^^^^^^^ here should be typename

Теперь он прекрасно компилируется: http://ideone.com/0SwO9

Но вы используете typename как:

template <typename T>
class Foo <T, std::enable_if<typename  Trait<T>::IsGood::value>::type>
{};                        //^^^^^^^ wrong place

Trait<T>::IsGood::valueне тип , поэтому вы не можете применить typename к нему.

Сообщение об ошибке GCC очень ясно:

prog.cpp: 12: 62: ошибка: несоответствие типа / значения в аргументе 1 в списке параметров шаблона для 'шаблонаstruct std :: enable_if '

Смотрите сами: http://ideone.com/9ujJv

...