2012-05-16 55 views
2

我要做到以下幾點: -如何定義靜態數組到模板類的成員函數?

​​

我該怎麼辦呢? 我得到以下錯誤: -

g++ memeber_func_ptr_array.cpp 
memeber_func_ptr_array.cpp:14:1: error: need ‘typename’ before ‘A<I>::fptr’ because ‘A<I>’ is a dependent scope 
memeber_func_ptr_array.cpp:17:2: error: expected unqualified-id before ‘;’ token 
+4

您是否嘗試在'A :: fptr'之前添加'typename'? –

+3

其實*閱讀*的錯誤信息確實每隔一段時間都會有所幫助... –

+0

我嘗試添加typename並獲得了一些不同的錯誤消息(甚至更多混淆錯誤消息)。訣竅是添加const typename而不僅僅是typename。 – owagh

回答

4

兩件事。

  1. fptrdependent type所以你需要typename

    template <typename I> 
    const typename A<I>::fptr A<I>::arr[2] = { // also note the 2 and the const 
        &A<I>::f, 
        &A<I>::g 
    }; 
    

    正如羅在評論中指出的那樣,你的宣言是const所以定義必須是const爲好。

  2. 客戶端代碼(文件只包含頭)需要知道數組有多大,所以你需要數組在聲明實際尺寸:

    static const fptr arr[2]; // include size 
    

    您只能使用自動扣除當數組在同一個地方聲明並初始化時,該數組的大小。

+0

感謝您的快速回答 – owagh

0

使用typename爲:

template <typename I> 
    typename A<I>::fptr A<I>::arr[] = { &A<I>::f, &A<I>::g }; 
//^^^^^^^^note this 

這是因爲fptr依賴類型。

2

您需要在A<I>::fptr之前添加const typenametypename是告訴編譯器fptrA<I>中的一種類型。

您可能想看看C++模板:Vandevoorde和Josuttis的完整指南以獲取更多信息。

相關問題