2013-02-15 119 views
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::**)()' 

(讓我們忽略的意義[針對問題]事實陣列還應類之外聲明實際存在)

這如何實現?

回答

6

你忘記了確保const正確性。更改爲:

template<const ptr a[]> 
     ~~~~~ 
+0

非常量模板參數?那是什麼? - 數組與模板參數相同。 – 2013-02-15 11:41:42

+0

@KonradRudolph數組對指針的衰減適用,所以實際的類型是'const ptr *'(以前的'ptr *')。指針本身是prvalue。 – ecatmur 2013-02-15 11:42:50

+0

該死的,這是一個愚蠢的問題(你解決了它 - thx!並且爲了記錄,我沒有對你的答案投下贊成票,我打算在一段時間內接受它(當我被允許時) – 2013-02-15 11:45:05