2015-08-18 4 views
8
#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() не отображается?

f< N - 1 >(); 

вызов функции f который не является ни видно в определении шаблона, ни найден ADL.

+0

Немного досадно, что компилятор не показывает (или вы его не указали из этого сообщения), что N == 2, когда это происходит. Кроме того, эта проблема обычно решается специализацией шаблона ('template <> void f <1>() {}'. – MSalters

+0

Можете ли вы включить версию компилятора и генерируемое сообщение об ошибке * whole * – Yakk

+0

было скомпилировано Xcode, и у меня есть уже отправлено полное сообщение об ошибке – Sherwin

ответ

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 версии.

+1

спасибо большое! – Sherwin

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 
+2

... или вперед объявить версию N == 1. –

+1

спасибо за ваш ответ! – Sherwin

Смежные вопросы