为什么编译器抱怨f()不可见?

时间:2015-08-18 06:46:26

标签: c++ templates c++11

#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找到。

2 个答案:

答案 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版本功能的原型。