Я пытаюсь использовать std::enable_if
с неиспользуемым и безымянным параметром типа, чтобы не искажать тип return
. Однако следующий код не компилируется.
#include <iostream>
template <typename T, typename = std::enable_if_t<!std::is_integral<T>::value>>
T foo() { std::cout << "non-integral" << std::endl; return T(); }
template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
T foo() { std::cout << "integral" << std::endl; return T(); }
int main() {
foo<float>();
foo<int>();
}
Компилятор говорит:
7:3: error: redefinition of 'template<class T, class> T foo()'
4:3: note: 'template<class T, class> T foo()' previously declared here
In function 'int main()':
11:12: error: no matching function for call to 'foo()'
11:12: note: candidate is:
4:3: note: template<class T, class> T foo()
4:3: note: template argument deduction/substitution failed:
В чем проблема? Как мне изменить код, чтобы он скомпилировался? Учебник "Discovering Modern C++" явно поощряет использование std::enable_if
с параметрами анонимного типа.
РЕДАКТИРОВАТЬ: я знаю, что это работает, если я помещу std::enable_if
в возвращаемый тип. Однако я намерен получить более подробную информацию о том, почему это не работает, если я использую его с параметрами анонимного типа. Как я уже сказал, мой учебник поощряет вариант с использованием параметров анонимного типа, поэтому мне интересно, почему мой код не компилируется.
std::enable_if
в возвращаемый тип? - person DeiDei   schedule 26.10.2016