Это проблема не только с enable_if. Вы получаете ту же ошибку в Visual Studio и gcc со следующим кодом:
struct TypeVoid {
typedef void type;
};
template<typename T>
void f();
template<typename T>
typename T::type f() {
}
int main()
{
f<TypeVoid>();
return 0;
}
Я думаю, что основная проблема заключается в том, что тип возвращаемого значения (до создания экземпляра) является частью сигнатуры функции шаблона. Больше информации здесь .
Что касается вашего кода, если объявление ссылается на определение, вы должны соответствовать обоим:
// Declaration
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t);
// Definition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}
Если объявление ссылается на другую функцию, компилятор никогда не сможет выбрать правильный для int s, потому что они оба действительны. Однако вы можете отключить первый для int s, используя disable_if :
// Other function declaration
template <typename T>
typename boost::disable_if<boost::is_same<T, int> >::type foo(T t);
// Defition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}