2012-05-16 72 views
2

我要做到以下几点: -如何定义静态数组到模板类的成员函数?

​​

我该怎么办呢? 我得到以下错误: -

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 
+4

您是否尝试在'A :: fptr'之前添加'typename'? –

+3

其实*阅读*的错误信息确实每隔一段时间都会有所帮助... –

+0

我尝试添加typename并获得了一些不同的错误消息(甚至更多混淆错误消息)。诀窍是添加const typename而不仅仅是typename。 – owagh

回答

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 
    }; 
    

    正如罗在评论中指出的那样,你的宣言是const所以定义必须是const为好。

  2. 客户端代码(文件只包含头)需要知道数组有多大,所以你需要数组在声明实际尺寸:

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

    您只能使用自动扣除当数组在同一个地方声明并初始化时,该数组的大小。

+0

感谢您的快速回答 – owagh

0

使用typename为:

template <typename I> 
    typename A<I>::fptr A<I>::arr[] = { &A<I>::f, &A<I>::g }; 
//^^^^^^^^note this 

这是因为fptr依赖类型。

2

您需要在A<I>::fptr之前添加const typenametypename是告诉编译器fptrA<I>中的一种类型。

您可能想看看C++模板:Vandevoorde和Josuttis的完整指南以获取更多信息。

相关问题