Смешивание специализации шаблона и enable_if в шаблоне функции только с шаблонным типом возвращаемого значения

У меня есть следующий код, который не компилируется в VC2010:

#include <type_traits>

using namespace std;

template <class C>
typename enable_if<true, C>::type
foo()
{ return C(); }

template <>
bool
foo()
{ return true; } // error C2785: 'enable_if<true,_Type>::type foo(void)' 
                 // and 'bool foo(void)' have different return types

int main()
{
    auto a = foo<int>();
    auto b = foo<bool>();
}

Сообщение об ошибке кажется ошибочным, так как первая версия foo() кажется функционально идентичной template <class C> C foo();, которая успешно компилируется.

Есть ли способ смешивать и сопоставлять шаблоны функций enable-if и явные специализации шаблонов?


person Ayjay    schedule 29.09.2011    source источник
comment
Разве это не должно быть template<> bool foo<bool>()?   -  person edA-qa mort-ora-y    schedule 29.09.2011


Ответы (2)


Специализация шаблона функции (к счастью!) не обязана возвращать тот же тип, что и неспециализированный шаблон, поэтому здесь проблема не в этом.

На самом деле enable_if не имеет ничего общего с вашей ошибкой, в вашем коде просто отсутствует список аргументов шаблона в специализации:

template <>
bool foo<bool>()
{ return true; }

Кстати, почему вы используете enable_if, если условие всегда истинно? (Я предполагаю, что это не так в вашем реальном коде, но я просто хочу быть уверенным :)!)

person Luc Touraille    schedule 29.09.2011
comment
Потому что это очень упрощенная версия :-) Настоящая версия содержит условие в enable_if. На самом деле я работаю над этим для еще одного вопроса о переполнении стека! - person Ayjay; 29.09.2011

Проблема только в синтаксисе полной специализации. Так должно быть:

template <> bool foo<bool>() { return true; }
                    ^^^^^^
person Kerrek SB    schedule 29.09.2011