我已经基于原始模板类制作了专门的模板,如下所示:
基本模板:
template <typename T>
class MyData {
public:
MyData(T param) : data(param) {}
T GetData() const {
return data;
}
private:
T data;
};
专业模板:
template <>
class MyData<char*> {
public:
MyData(const char* param) {
int len = static_cast<int>(strlen(param));
data = new char[len + 1];
strcpy_s(data, static_cast<rsize_t>(len + 1), param);
}
~MyData() {
delete[] data;
}
const char* GetData() const {
return data;
}
private:
char* data;
};
这段代码很好用,但是我想知道模板专业化类型是否有任何明确的条件。例如,如果我使函数专门化,则返回类型和所有参数的类型必须相同。
template <>
const char* Add(const char* pLeft, const char* pRight) {
----------- ----------- -----------
| | |
+----------------+------------------+
...
}
在类MyData
中,类的模板类型为char*
,但构造函数的参数类型为const char*
。但是,编译代码时没有错误。所以我想知道在类模板专门化中是否有像这样的类型条件。
答案 0 :(得分:1)
在这里,函数专长和类专长是有区别的。类的专业化可能与另一组成员,函数和基类完全不同。以下内容可以很好地编译:
template <typename T>
class Foo
{
public:
void Bar() {}
private:
int val;
};
class Parent {};
template <>
class Foo<char> : public Parent
{
public:
void BarBar() {}
private:
double val;
};
int main()
{
Foo<int> f;
Foo<char> ff;
}