为什么限定名称错误?

时间:2015-08-25 15:12:19

标签: c++ templates

我想了解编译器为什么会出现此错误以及需要更改哪些内容?我正在玩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()
{
}

错误是:

  

错误:无效使用限定名称test :: table&lt; 0,Ns ...&gt; :: fns

1 个答案:

答案 0 :(得分:0)

test::table可能是test的成员模板,但它没有对test成员函数的无限制访问权限。这就是你在这里假设的:

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

您可以使用qualified-id来指向成员指针(即&test::foo<Ns>)。此外,fns专业化后table的“定义”不能进入类范围。静态数据成员定义位于命名空间范围

您还需要在此定义中将*test::table更改为test::*table,因为后者正确表示指向成员的指针。 @chris's example shows the correct code

如果您有权访问C ++ 14,也可以取消使用table模板并使用内置的std::index_sequence工具。

#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>{});
    }
};