C++ 如何从专用成员函数访问模板参数? #包括 样板 甲级 { 公众: void func(); }; 样板 void A::func() { printf(“%d\n”,n); } int main() { A A; a、 func(); 返回0; }

C++ 如何从专用成员函数访问模板参数? #包括 样板 甲级 { 公众: void func(); }; 样板 void A::func() { printf(“%d\n”,n); } int main() { A A; a、 func(); 返回0; },c++,templates,C++,Templates,当我试图编译这段代码时,g++给出了以下错误: #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;

当我试图编译这段代码时,g++给出了以下错误:

#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;
}
test.cpp:10:22:错误:不完整类型“class A”的使用无效
test.cpp:4:7:错误:声明“A类”
我只在A::func完全没有专门化,并且函数也专门化为N时才编译了这个函数


如何将A::func专门化为T和access N(应该可以是任何值)?

如果可能,语法必须是

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>’
(当然,
func
的定义可以内联到类模板定义中。)

但是,当类模板有许多其他成员时,这可能不是最佳选择,因为您必须重新定义所有成员:

(§14.5.5/3)[…]类模板专门化是一种独特的模板。类模板部分专门化的成员与主模板的成员无关。应定义以需要定义的方式使用的类别模板部分专业化成员;主模板成员的定义从未用作类模板部分专业化成员的定义。[……]


在某些情况下,最好声明一个单独的类模板,仅将这一个函数作为成员(如果不需要访问其他成员,则可能是静态成员-可能将需要访问的成员作为显式函数参数传递),然后从实际的类模板中引用该类模板(以避免对整个类模板进行部分专门化)。

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

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>’
(当然,
func
的定义可以内联到类模板定义中。)

但是,当类模板有许多其他成员时,这可能不是最佳选择,因为您必须重新定义所有成员:

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


在某些情况下,最好声明一个单独的类模板,仅将这一个函数作为成员(如果不需要访问其他成员,则可能是静态成员-可能将需要访问的成员作为显式函数参数传递),然后从实际的类模板中引用该类模板(为了避免必须部分专门化整个类模板)。

你确定这是相关的引用吗?@jrok它是相关的,但它可能不是唯一相关的引用。我仍然在寻找一个明确表示无法部分专门化单个成员的引用。(尽管可能没有任何这样的声明。)OP不是专门化成员,
func
不是模板。这里的问题是,在OP试图定义该专门化的
func
成员时,类模板部分专门化没有定义。如果我们定义了部分专门化,那么。很好,彻底的回答。接受。@jogojapan二读,th哦,我明白你的意思,是的,这句话似乎很有关联:)+1你确定这是相关的话吗?@jrok这是相关的,但可能不是唯一相关的。我仍然在寻找一个明确的说法,即没有办法部分专业化某个成员。(尽管可能没有任何这样的说法。)OP不是专门化成员,
func
不是模板。这里的问题是,在OP试图定义该专门化的
func
成员时,类模板部分专门化没有定义。如果我们定义了部分专门化,那么。很好,彻底的回答。接受。@jogojapan二读,th哦,我明白你的意思了,是的,这句话似乎很贴切:)+1
template<int N>
class A<int,N>
{
public:
  void func();
};

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