我想做以下事情: -
#include <iostream>
template <typename I>
class A {
public:
I member_;
void f() {}
void g() {}
typedef void (A::*fptr) ();
static const fptr arr[];
};
template <typename I>
A<I>::fptr A<I>::arr[] = {
&A<I>::f,
&A<I>::g
};
我该怎么做? 我收到以下错误: -
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
答案 0 :(得分:4)
两件事。
fptr
是dependent 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
};
正如jrok在评论中指出的那样,您的声明为const
,因此定义也必须为const
。
客户端代码(只包含标题的文件)需要知道数组的大小,因此您需要声明中数组的实际大小:
static const fptr arr[2]; // include size
在数组声明并在同一位置初始化时,您只能使用自动扣除数组的大小。
答案 1 :(得分:2)
您需要在const typename
之前添加A<I>::fptr
。 typename
可以告诉编译器fptr
中的A<I>
是一种类型。
您可能需要查看C ++模板:Vandevoorde和Josuttis的完整指南以获取更多信息。
答案 2 :(得分:0)
将typename
用作:
template <typename I>
typename A<I>::fptr A<I>::arr[] = { &A<I>::f, &A<I>::g };
//^^^^^^^^note this
这是因为fptr
是依赖类型。