如何为模板化类的成员函数定义静态数组?

时间:2012-05-16 15:34:18

标签: c++ arrays templates static function-pointers

我想做以下事情: -

#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

3 个答案:

答案 0 :(得分: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
    };
    

    正如jrok在评论中指出的那样,您的声明为const,因此定义也必须为const

  2. 客户端代码(只包含标题的文件)需要知道数组的大小,因此您需要声明中数组的实际大小:

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

    在数组声明并在同一位置初始化时,您只能使用自动扣除数组的大小。

答案 1 :(得分:2)

您需要在const typename之前添加A<I>::fptrtypename可以告诉编译器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依赖类型。