VS里面的模板类的声明和实现不能分开成两个文件的吗?解决方案

VS里面的模板类的声明和实现不能分开成两个文件的吗?
本帖最后由 su_787910081 于 2013-10-13 20:20:59 编辑
VS里面的模板类的声明和实现不能分开成两个文件的吗?

我在VS2010  里面写了一个模板类,我把声明和实现分开后,编译能通过,但是一但在外面使用这个类实例化一个对象的话,连构造函数和析构函数都无法连接。后来我把实现全部写到头文件中去了后,才可以用的。这是为什么呢。还是我写错了?
C++ 模板类

------解决方案--------------------
一般情况下,模板定义是要全部写在头文件中的。因为编译器在实例化模板的时候,需要见到完整的定义。
不过模板也可以用前置声明+显示实例化的方式。只是用法更怪一些,而且用途受限制(没有显示实例化过的类型还是不能用),这个《C++ Template》一书上有讲到。
------解决方案--------------------
楼主可以看看STL的头文件,基本上都是声明、实现在一起的。
------解决方案--------------------
是,模板都放一起确实很长。而且开源还好,闭源的话,知识产权可能也是问题。

你想的没错,对于没有使用过的模板函数,甚至模板类,编译器只做非常基本的检查,不会实例化,也就不会生成目标代码。这样也有好处:不必为没有使用的东西买单。

至于说检查错误,如果是自己写着玩玩的小程序,那么用不到的函数你写它做啥呢?如果是正儿八经的项目甚至函数库,那么你本来也应该自己写点单元测试什么的,否则,难道你把完全没测过的东西直接发布给别人用么?
------解决方案--------------------
VC没有实现export关键字。以后也不会实现。
------解决方案--------------------
EDG实现了模板类的导出,但是认为这并不是明智的选择,参考Why We Can’t Afford Export
------解决方案--------------------
同意ls观点。
实在觉得h文件太长,可以把模板定义写在cpp里,然后在h文件末尾#include “x.cpp".
但其实是换汤不换药,模板声明和定义还是必须在同一文件中。
------解决方案--------------------
引用:
Quote: 引用:

楼主可以看看STL的头文件,基本上都是声明、实现在一起的。

那要写在一个头文件企不是很长,很麻烦。不过也没关系。
另外这个模板类写出来后,编译器根本就不会去帮我们检查错误的啊。
难道必须要全部成员函数都用一遍才可以啊。

这是我在看<<inside c++ model>>时的自问自答,也许对你有帮助
1.描述一下模板中有些很明显的错误,为什么编译器却通过了.
   因为模板中的函数或类中的成员函数,及类定义等,只有使用的时候,才实例化.而有些语意上的错误只有在实例化了之后,再能检查出来,而编译器对模板的检查,也大多停留在词法分析的阶段.因此有些很明显的语法上的错误,却检查不出来:比如实现了一个该 类中没有定义的成员函数.

3.编译器在成员函数实例化时必然考虑的三个问题?
   1.编译器如何找到函数的定义(其实声明和实现放在一起,只是为了解决这个问题,毕竟这种方式简单可靠)
   2.编译器如何只实例化用的成员函数
   3.编译器如何阻止,成员函数在多个.o文件中实例化.