模板类的构造函数, 类内定义与类外定义的区别.

mitshan 2017-05-10 05:25:55
直接上代码片段
template <typename T>
class A {
public:
A<T>(); /******在模板类的内部, 就可以加上模板参数******/
};

template <typename T>
A<T>::A() /******就是这一行******/
{
std::cout << "I am constructor A() outside class\n";
}

第8行, 改写成
A<T>::A<T>()

就不行了. 编译错误为
error: ‘A<T>::A’ names the constructor, not the type 
A<T>::A<T>()
^
error: and ‘A<T>’ has no template constructors

但是如果在模板内进行定义或者声明(第4行), 构造函数名后面是可以加上模板参数的.
这是为什么呢?
...全文
1033 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mitshan 2017-05-18
  • 打赏
  • 举报
回复
好像有点明白了,应该是声明和定义之间的区别吧。
ck2333 2017-05-14
  • 打赏
  • 举报
回复
引用 2 楼 mitshan 的回复:
[quote=引用 1 楼 qq_36409192 的回复:] template<class T> void f(){ }<---- 这之后T就不能用了 template<class T> <--- 这个T和上面的T不是一个 class K{ }<---- 这之后T就不能用了 你的第一行模板作用对象是整个类,所以在使用的时候,你声明了其类型以后,构造函数就可以直接用了,并不需要再一次声明类型。
模板类型作用范围我清楚, 范围内构造函数可省略模板类型. 但是, 在类外定义时,
template <typename T>
A<T>::A() {}
省略了模板类型, 这是正确的. 但是
template <typename T>
A<T>::A<T>()
没有省略模板类型, 却是错误的, 在模板类内不省略却是正确的(1L代码第4行). 这是为什么呢? [/quote] 构造函数后面的<T>不是省略,是不能加。
template <typename T>
A<T>::A()
{
    std::cout << "I am constructor A() outside class\n";
}
你这个template只是为了对应你的类,类内不需要再次声明模板类型。
mitshan 2017-05-14
  • 打赏
  • 举报
回复
引用 1 楼 qq_36409192 的回复:
template<class T> void f(){ }<---- 这之后T就不能用了 template<class T> <--- 这个T和上面的T不是一个 class K{ }<---- 这之后T就不能用了 你的第一行模板作用对象是整个类,所以在使用的时候,你声明了其类型以后,构造函数就可以直接用了,并不需要再一次声明类型。
模板类型作用范围我清楚, 范围内构造函数可省略模板类型. 但是, 在类外定义时,
template <typename T>
A<T>::A() {}
省略了模板类型, 这是正确的. 但是
template <typename T>
A<T>::A<T>()
没有省略模板类型, 却是错误的, 在模板类内不省略却是正确的(1L代码第4行). 这是为什么呢?
ck2333 2017-05-10
  • 打赏
  • 举报
回复
template<class T> void f(){ }<---- 这之后T就不能用了 template<class T> <--- 这个T和上面的T不是一个 class K{ }<---- 这之后T就不能用了 你的第一行模板作用对象是整个类,所以在使用的时候,你声明了其类型以后,构造函数就可以直接用了,并不需要再一次声明类型。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧