VS里面的模板类的声明和实现不能分开成两个文件的吗?解决方案
VS里面的模板类的声明和实现不能分开成两个文件的吗?
VS里面的模板类的声明和实现不能分开成两个文件的吗?
我在VS2010 里面写了一个模板类,我把声明和实现分开后,编译能通过,但是一但在外面使用这个类实例化一个对象的话,连构造函数和析构函数都无法连接。后来我把实现全部写到头文件中去了后,才可以用的。这是为什么呢。还是我写错了?
------解决方案--------------------
一般情况下,模板定义是要全部写在头文件中的。因为编译器在实例化模板的时候,需要见到完整的定义。
不过模板也可以用前置声明+显示实例化的方式。只是用法更怪一些,而且用途受限制(没有显示实例化过的类型还是不能用),这个《C++ Template》一书上有讲到。
------解决方案--------------------
楼主可以看看STL的头文件,基本上都是声明、实现在一起的。
------解决方案--------------------
是,模板都放一起确实很长。而且开源还好,闭源的话,知识产权可能也是问题。
你想的没错,对于没有使用过的模板函数,甚至模板类,编译器只做非常基本的检查,不会实例化,也就不会生成目标代码。这样也有好处:不必为没有使用的东西买单。
至于说检查错误,如果是自己写着玩玩的小程序,那么用不到的函数你写它做啥呢?如果是正儿八经的项目甚至函数库,那么你本来也应该自己写点单元测试什么的,否则,难道你把完全没测过的东西直接发布给别人用么?
------解决方案--------------------
VC没有实现export关键字。以后也不会实现。
------解决方案--------------------
EDG实现了模板类的导出,但是认为这并不是明智的选择,参考Why We Can’t Afford Export
------解决方案--------------------
同意ls观点。
实在觉得h文件太长,可以把模板定义写在cpp里,然后在h文件末尾#include “x.cpp".
但其实是换汤不换药,模板声明和定义还是必须在同一文件中。
------解决方案--------------------
这是我在看<<inside c++ model>>时的自问自答,也许对你有帮助
1.描述一下模板中有些很明显的错误,为什么编译器却通过了.
因为模板中的函数或类中的成员函数,及类定义等,只有使用的时候,才实例化.而有些语意上的错误只有在实例化了之后,再能检查出来,而编译器对模板的检查,也大多停留在词法分析的阶段.因此有些很明显的语法上的错误,却检查不出来:比如实现了一个该 类中没有定义的成员函数.
3.编译器在成员函数实例化时必然考虑的三个问题?
1.编译器如何找到函数的定义(其实声明和实现放在一起,只是为了解决这个问题,毕竟这种方式简单可靠)
2.编译器如何只实例化用的成员函数
3.编译器如何阻止,成员函数在多个.o文件中实例化.
VS里面的模板类的声明和实现不能分开成两个文件的吗?
我在VS2010 里面写了一个模板类,我把声明和实现分开后,编译能通过,但是一但在外面使用这个类实例化一个对象的话,连构造函数和析构函数都无法连接。后来我把实现全部写到头文件中去了后,才可以用的。这是为什么呢。还是我写错了?
C++
模板类
------解决方案--------------------
一般情况下,模板定义是要全部写在头文件中的。因为编译器在实例化模板的时候,需要见到完整的定义。
不过模板也可以用前置声明+显示实例化的方式。只是用法更怪一些,而且用途受限制(没有显示实例化过的类型还是不能用),这个《C++ Template》一书上有讲到。
------解决方案--------------------
楼主可以看看STL的头文件,基本上都是声明、实现在一起的。
------解决方案--------------------
是,模板都放一起确实很长。而且开源还好,闭源的话,知识产权可能也是问题。
你想的没错,对于没有使用过的模板函数,甚至模板类,编译器只做非常基本的检查,不会实例化,也就不会生成目标代码。这样也有好处:不必为没有使用的东西买单。
至于说检查错误,如果是自己写着玩玩的小程序,那么用不到的函数你写它做啥呢?如果是正儿八经的项目甚至函数库,那么你本来也应该自己写点单元测试什么的,否则,难道你把完全没测过的东西直接发布给别人用么?
------解决方案--------------------
VC没有实现export关键字。以后也不会实现。
------解决方案--------------------
EDG实现了模板类的导出,但是认为这并不是明智的选择,参考Why We Can’t Afford Export
------解决方案--------------------
同意ls观点。
实在觉得h文件太长,可以把模板定义写在cpp里,然后在h文件末尾#include “x.cpp".
但其实是换汤不换药,模板声明和定义还是必须在同一文件中。
------解决方案--------------------
这是我在看<<inside c++ model>>时的自问自答,也许对你有帮助
1.描述一下模板中有些很明显的错误,为什么编译器却通过了.
因为模板中的函数或类中的成员函数,及类定义等,只有使用的时候,才实例化.而有些语意上的错误只有在实例化了之后,再能检查出来,而编译器对模板的检查,也大多停留在词法分析的阶段.因此有些很明显的语法上的错误,却检查不出来:比如实现了一个该 类中没有定义的成员函数.
3.编译器在成员函数实例化时必然考虑的三个问题?
1.编译器如何找到函数的定义(其实声明和实现放在一起,只是为了解决这个问题,毕竟这种方式简单可靠)
2.编译器如何只实例化用的成员函数
3.编译器如何阻止,成员函数在多个.o文件中实例化.