2013-06-02 87 views
1
#include <stdio.h> 

template<typename T, int N> 
class A 
{ 
public: 
    void func(); 
}; 
template<typename T, int N> 
void A<int, N>::func() 
{ 
    printf("%d\n", N); 
} 
int main() 
{ 
    A<int, 3> a; 
    a.func(); 
    return 0; 
} 

当我尝试编译这段代码,G ++提供了这些错误:如何从专门的成员函数访问模板参数?

test.cpp:10:22: error: invalid use of incomplete type ‘class A<int, N>’ 
test.cpp:4:7: error: declaration of ‘class A<int, N>’ 

我只设法编译这个时候A :: func被不专业的一切,当函数也是专门为N.

我如何专注于A :: func的T和访问N(应该可以是任何值)呢?

回答

4

如果这是可能的,语法必须

template<int N> 
void A<int, N>::func() 
{ 
    printf("%d\n", N); 
} 

即,T不会在模板参数列表中被提及。

但不幸的是,这是不可能的。单个功能(包括成员功能)不能部分专用。

从标准(在大约局部类模板特部分):

(§14.5.5/ 2)每一类模板部分特例是应的成员可以设置不同的模板和DE音响nitions模板部分专业化(14.5.5.3)。

在你的情况,最直接的方式来完成你需要,因此将部分-专门整个类模板的内容:

template<int N> 
class A<int,N> 
{ 
public: 
    void func(); 
}; 

template<int N> 
void A<int,N>::func() 
{ 
    printf("%d\n",3); 
} 

Working example of this on Coliru(当然的func定义会内联。到类模板定义)

但是,这可能不是最佳的时候类模板有许多其他成员,因为你将不得不重新定义他们都:

(§14.5.5/ 3)[...]类模板专业化是一个独特的模板。类模板部分专业化的成员与主模板的成员无关。应该定义以需要定义的方式使用的类模板部分专业化成员;主模板成员的定义决不会用作类模板部分专业化成员的定义。 [...]

在某些情况下优选的是,声明一个单独的类模板与仅这一个功能部件(可能的静态成员,如果需要向其他成员没有访问–可能传递构件,其访问必需作为显式函数参数),然后从实际的类模板中引用它(以避免必须部分专门化整个类模板)。

+0

你确定这是相关的报价吗? – jrok

+0

@jrok它是相关的,但它可能不是唯一相关的。我仍然在寻找一种明确表示无法部分专门化个别成员的方法。 (虽然可能没有这样的说法。) – jogojapan

+0

OP并不是专门化成员,'func'不是模板。这里的问题是,在OP试图定义该特化的'func'成员的时候没有定义类模板部分特化。如果我们定义部分专业化,那么[It works](http://coliru.stacked-crooked.com/view?id=2b153beb291c2859b6de86f971c64881-0be4386eb9b168939a6a7d681c02387e)。 – jrok

相关问题