編輯:問題解決了,這只是錯誤的函數聲明順序。遞歸模板調用好奇地不可能與SFINAE
當試圖解決一個乍一看似乎很瑣碎的問題時,我偶然發現了我無法解釋的行爲。
我想處理一個任意的int數組遞歸,當然我必須以某種方式停止遞歸。 作爲偏特以具體的數字是不可能的模板函數(如
template<typename T, int N> foo<T, 0>(void)
),我想這個假貨與SFINAE。但是當我想從第一個調用第二個SFNIAE函數時,我得到一個編譯器錯誤。 完整的代碼示例:
#include <algorithm>
#include <iostream>
using namespace std;
// -------------------------------------------------------------
template<typename T, int N>
void foo(T const& param, typename enable_if<N != 0, int>::type* = 0)
{
cout << "recursive step " << N << endl;
/* --- This was, what I desired: --- */
//foo<T, N - 1>(param);
/* --- THIS IS CAUSING AN ERROR! --- */
foo<T, 0>(param);
}
// -------------------------------------------------------------
template<typename T, int N>
void foo(T const& param, typename enable_if<N == 0, int>::type* = 0)
{
cout << "finish recursion" << endl;
}
// =============================================================
int main()
{
int a[5] = {0, 1, 2, 3, 4};
foo<decltype(a), 5>(a);
/* --- SAME CALL AS WITHIN foo(), BUT CAUSING NO ERROR! --- */
foo<decltype(a), 0>(a);
}
編譯器告訴我: 的main.cpp:9:Fehler:無型「結構的std :: enable_if」命名的「類型」 這麼看來他莫名其妙解決不了的第二個功能。 但是,如果我從main()調用函數,它不是問題。
這是我第一次和SFINAE合作,我希望我沒有犯任何微小的錯誤。 感謝大家讀了這麼多!
切換兩個定義 - 第一個定義沒有看到第二個定義,但您試圖調用它(小事件必須高於正常情況)。 – Holt