2015-08-25 145 views
1

我只想了解編譯器爲什麼會給出這個錯誤以及需要更改哪些內容?我只是在玩C++ 11代碼。爲什麼限定名稱錯誤?

class test 
{ 
public: 
    template<int N> 
    bool foo() { return true;} 

    template<int N, int... Ns> 
    struct table : table<N-1, N-1,Ns...> {}; 

    template<int... Ns> 
    struct table<0,Ns...> 
    { 
     static constexpr bool(test::table<0,Ns...>::*fns[])() = {foo<Ns>...}; 
    }; 

    // below line gives the error 

    template<int... Ns> 
    constexpr bool (*test::table<0,Ns...>::fns[sizeof...(Ns)])(); 
}; 

int main() 
{ 
} 

的錯誤是:

error: invalid use of qualified-name test::table<0, Ns ...>::fns

+0

這個代碼有很多問題。例如,'foo'是一個「'test :: *'」,而不是「'test :: table <0, Ns...> :: *'」。這些問題中的大部分都與您顯示的錯誤無關。 – chris

+0

你想做什麼?如果通過倒數第二行來聲明'test'的成員函數,則必須給該成員函數一個非限定名稱。 – JohnB

+0

@JohnB,我認爲OP正試圖定義靜態成員'fns'。這個定義不應該在課堂上。 – chris

回答

0

test::table可能是test成員模板,但它並沒有給test的成員函數不合格訪問。這是我們假定你是什麼樣的位置:

= {foo<Ns>...}; 
// ^^^ 

您使用一個合格的-ID爲指針到成員得到很好的形成(即&test::foo<Ns>)。此外,table專業化後的fns的「定義」不能進入類範圍內。靜態數據成員定義進入命名空間範圍

您還需要在此定義中將*test::table更改爲test::*table,因爲後者正確表示指向成員的指針。 @chris's example shows the correct code


你也可以做掉與table模板,並使用內置std::index_sequence的工具,如果你有機會到C++ 14。

#include <utility> 

struct test { 
    template<int>bool foo(){return true;} 
    template<int...Is> 
    static auto& make_foo_table(std::index_sequence<Is...>){ 
     using callable=bool(test::*)(); 
     using table=callable[sizeof...(Is)]; 
     return table{&test::foo<Is>...}; 
    } 
    template<int N> 
    constexpr static auto&make_foo_table(){ 
     return make_foos(std::make_index_sequence<N>{}); 
    } 
}; 
相關問題