3
我試圖做用一個例子是最好的描述:指針數組成員的(補償)在C模板參數++
class A
{
int f1();
int f2();
int f3();
typedef int (A::*ptr)();
constexpr static const ptr array[3] =
{
&A::f1,
&A::f2,
&A::f3,
};
template<ptr a[]>
int sum()
{
int s = 0;
for (int i = 0; i < 3; i++)
s += (this->*a[i])();
};
int f4() { return sum<array>(); };
};
這顯然是行不通的,給予以下在GCC輸出(在模板實例化的路線,定義似乎罰款):
main.cpp: In member function 'int A::sum()':
main.cpp:49:2: warning: no return statement in function returning non-void [-Wreturn-type]
main.cpp: In member function 'int A::f4()':
main.cpp:51:31: error: no matching function for call to 'A::sum()'
main.cpp:51:31: note: candidate is:
main.cpp:44:6: note: template<int (A::** a)()> int A::sum()
main.cpp:44:6: note: template argument deduction/substitution failed:
main.cpp:51:31: error: could not convert template argument 'A::array' to 'int (A::**)()'
(讓我們忽略的意義[針對問題]事實陣列還應類之外聲明實際存在)
這如何實現?
非常量模板參數?那是什麼? - 數組與模板參數相同。 – 2013-02-15 11:41:42
@KonradRudolph數組對指針的衰減適用,所以實際的類型是'const ptr *'(以前的'ptr *')。指針本身是prvalue。 – ecatmur 2013-02-15 11:42:50
該死的,這是一個愚蠢的問題(你解決了它 - thx!並且爲了記錄,我沒有對你的答案投下贊成票,我打算在一段時間內接受它(當我被允許時) – 2013-02-15 11:45:05