#include <iostream>
using namespace std;
template <size_t N>
typename enable_if<(N > 1), void>::type f(){
cout << N - 1 << ' ';
f<N - 1>();
}
template <size_t N>
typename enable_if<N == 1, void> ::type f() {
cout << 1;
}
int main() {
f<4>();
}
编译器在第8行抱怨:
f< N - 1 >();
调用功能
f
,该功能在模板定义中既不可见,也不在ADL
找到。
答案 0 :(得分:10)
颠倒函数定义的顺序。
#include <iostream>
#include <type_traits>
using namespace std;
template <size_t N>
typename enable_if<N == 1, void> ::type f() {
cout << 1;
}
template <size_t N>
typename enable_if<(N > 1), void>::type f(){
cout << N - 1 << ' ';
f<N - 1>();
}
int main() {
f<4>();
}
输出:
$ ./a.out
3 2 1 1
答案 1 :(得分:4)
请注意,该功能在函数调用下面定义。
您有两种可能的方法:
方法1:
#include <iostream>
#include <type_traits>
using namespace std;
template <size_t N>
typename enable_if<N == 1, void> ::type f() {
cout << 1;
}
template <size_t N>
typename enable_if<(N > 1), void>::type f(){
cout << N - 1 << ' ';
f<N - 1>();
}
int main() {
f<4>();
}
方法2:
您可以转发声明 N==1
版本功能的原型。