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