2015-08-18 13 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>(); 
} 

Compiler beschwert sich in Zeile 8:Warum beschwert sich der Compiler, dass f() nicht sichtbar ist?

f< N - 1 >(); 

Anruf f funktionieren, die weder in der Template-Definition ist noch von ADL gefunden.

+0

Ein bisschen schade, dass der Compiler nicht zeigt (oder Sie es aus diesem Beitrag weggelassen), dass N == 2, wenn dies auftritt. Dieses Problem wird normalerweise auch durch Template-Spezialisierung gelöst ('template <> void f <1>() {}'. – MSalters

+0

Können Sie die Compiler-Version einschließen, und die * gesamte * Fehlermeldung generiert? – Yakk

+0

wurde von Xcode kompiliert und ich habe bereits die gesamte Fehlermeldung gepostet – Sherwin

Antwort

4

Bitte beachten Sie, dass die Funktion unterhalb der Funktionsaufruf definiert ist.

Sie haben zwei mögliche Ansätze:

Ansatz 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>(); 
} 

Ansatz 2:

Sie können vorwärts erklären der Prototyp für die N==1 Version Funktion.

+1

Vielen Dank! – Sherwin

10

Kehren Sie die Reihenfolge Ihrer Funktionsdefinitionen um.

#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>(); 
} 

Ausgang:

$ ./a.out 
3 2 1 1 
+2

... oder forward deklarieren Sie die N == 1 Version. –

+1

Vielen Dank für Ihre Antwort! – Sherwin

Verwandte Themen