gpt4 book ai didi

c++ - C++中带有非类型参数的部分指定模板类

转载 作者:行者123 更新时间:2023-11-28 07:01:39 25 4
gpt4 key购买 nike

在下面的代码中,我遇到了编译错误

#include <iostream>

using namespace std;

template <typename T, int I>
class MyClass {
public:
void func1(){
cout<<"default: func1"<<endl;
}
void func2(){
cout<<"default: func2"<<endl;
}
private:
T haha;
};

template <typename T>
void MyClass<T, 1>::func1(){
cout<<"special: func1"<<endl;
};



int main()
{
MyClass<int, 2> intclass;
intclass.func1();
intclass.func2();

MyClass<double, 1> doubleclass;
doubleclass.func1();
doubleclass.func2();
return 0;
}

我遇到了以下编译错误:

partialspecifizednontype.cpp:19: error: invalid use of incomplete type 'class MyClass<T, 1>'
partialspecifizednontype.cpp:6: error: declaration of 'class MyClass<T, 1>'

有什么我不能这样做的具体原因吗?有什么解决方法可以实现这一目标吗?

我注意到,如果我的模板类没有第一个参数,一切正常。 (我的gcc是4.2.1)

下面的例子是可以的:

#include <iostream>

using namespace std;

template <int I>
class MyClass {
public:
void func1(){
cout<<"default: func1"<<endl;
}
void func2(){
cout<<"default: func2"<<endl;
}
};

template<>
void MyClass<1>::func1(){
cout<<"special: func1"<<endl;
};



int main()
{
MyClass<2> intclass;
intclass.func1();
intclass.func2();

MyClass<1> doubleclass;
doubleclass.func1();
doubleclass.func2();
return 0;
}

最佳答案

类模板的成员函数本身也是函数模板。这意味着您可以显式地特化它们(就像您在第二个示例中所做的那样),但是函数模板不能部分特化(就像您在第一个示例中尝试的那样)。

作为解决方法,您可以部分特化整个类:

template <typename T>
class MyClass<T, 1>
{
public:
void func1() { cout << "special: func1" << endl; };
// ...
};

您可能需要重构您的代码,将通用代码放入基类中,以使这种方法易于维护。

关于c++ - C++中带有非类型参数的部分指定模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22391679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com