【发布时间】:2014-08-27 13:13:23
【问题描述】:
我是 C++ 模板的新手。 谁能解释为什么我的专用构造函数永远不会被执行。 当我删除 const 和引用运算符时它可以工作。
#include<iostream>
#include<string>
using namespace std;
template<typename T>
class CData
{
public:
CData(const T&);
CData(const char*&);
private:
T m_Data;
};
template<typename T>
CData<T>::CData(const T& Val)
{
cout << "Template" << endl;
m_Data = Val;
}
template<>
CData<char*>::CData(const char* &Str)
{
cout << "Char*" << endl;
m_Data = new char[strlen(Str) + 1];
strcpy(m_Data, Str);
}
void main()
{
CData<int> obj1(10);
CData<char*> obj2("Hello");
}
输出是
模板
模板
【问题讨论】:
-
main必须返回int,而不是void。此外,strcpy和strlen的标头是<cstring>,而不是<string>。 -
字符串文字是一个数组左值,可以转换为指针纯右值。指针纯右值不能绑定到像
const char* &这样的非常量左值引用。这就是调用第一个 ctor 的原因。 -
顺便说一下,这不是部分专业化。它是单个成员函数的显式特化。
-
请注意,在第二次调用中选择第一个 ctor 使用了一个不推荐使用的转换:
const T&forT == char*产生一个char* const&,这需要转换 6 数组 @987654333将字符串文字的@ 转换为char*(非常量)。
标签: c++ templates template-specialization partial-specialization