导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

使用VS2005编译出现的奇怪问题

Chivalry 2010-08-05 09:01:54
之前一直用VC6,最近偶然一个项目切换到VS2005,碰到这么一个奇怪问题

我在Global.h里面定义类,在Global.cpp里面实现类,这个类是一个使用模板的类
然后我再Test.cpp里面#include "Global.h",然后在定义类的一个变量,比如Global g;,编译通过,但是链接失败,提示找不到Global的构造函数

但是,如果我把Global.cpp里面的类的实现代码拷贝到Global.h里面进行直接实现
或者不把Global.cpp里面的类的实现代码拷贝到Global.h里面,但是把类的函数声明和实现加上inline关键字

这两种情况下都是好的,编译链接通过

百思不得其解,请教给位啊!
...全文
95 点赞 收藏 22
写回复
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
siennaxu 2010-08-05
学习学习
回复
wangzf0916 2010-08-05
[Quote=引用 4 楼 jimoguilai 的回复:]
引用 3 楼 liyinlei 的回复:
VS不支持模板类分离编译。

一定要.h, .cpp分开的话,用到的模板类型在实现的cpp内 进行一次实例化。这样在别的模块中使用时 也能链接通过


用到的模板类型在实现的cpp内 进行一次实例化,什么意思?
[/Quote]


用内联函数就可以啦
回复
gengzhen_2005 2010-08-05
见识了,学习一下。。。
回复
[Quote=引用 15 楼 jimoguilai 的回复:]

明白了,再请教各位一个问题:
有什么好书推荐一下吗?
[/Quote]
C++Primer
C++Template全览
回复
梵海木 2010-08-05
学习了 最近正看模板Templates
回复
苏克贝塔03 2010-08-05
进来看的。
回复
Chivalry 2010-08-05
明白了,再请教各位一个问题:
有什么好书推荐一下吗?
回复
oyljerry 2010-08-05
http://blog.csdn.net/hikaliv/archive/2009/08/23/4476032.aspx
回复
oyljerry 2010-08-05
目前编译器都要求申明,定义写在一个h文件中去...

回复
jameshooo 2010-08-05
本来就是这样的,不需要任何理由。

模板类对于编译器来说只是一个暂存的中间状态,如果没有任何人使用它,它就是不存在的。一个不存在的东西,还谈什么申明与实现分离,甚至没有实现的概念,所以看起来是项目中的一个CPP文件,但这个文件中的代码不会被编译,而内联函数实现代码会被编译器直接转移到头文件的类申明中,跟在类内部直接定义函数的方式完全相同。当模板类被使用时,编译器根据模板构造中间基类,同时实现所有成员,内联成员函数都已经有了,非内联函数从来就未被编译过,链接时自然会发生找不到实现的错误。
回复
Eleven 2010-08-05
大部分编译器都无法对类模板进行分离编译。
进行包含编译模式 (inclusion)编译,即把声明和定义写在同一个文件(.h / .cpp / .hpp / .hxx)下。
回复
liyinlei 2010-08-05

比如要用到模板参数int类型。在实现的cpp里实例化一次。如下:

在实现的cpp里

template<class T>
SeqList<T>::SeqList()
{

}

//在别的方法里也好,还是定义一个变量也好,总之在此要先用一把
SeqList<int> seqList;



回复
Chivalry 2010-08-05
[Quote=引用 7 楼 akirya 的回复:]
这个类是一个使用模板的类
这个怎么解释?
[/Quote]

template<class T>
SeqList<T>::SeqList()
{

}

就是这种情况,不知道怎么描述,看来不能老是用VC6了,落伍了
有什么好书推荐一下吗?
回复
这个类是一个使用模板的类
这个怎么解释?
回复
loop_k 2010-08-05
进来学习。
回复
Chivalry 2010-08-05
[Quote=引用 3 楼 liyinlei 的回复:]
VS不支持模板类分离编译。

一定要.h, .cpp分开的话,用到的模板类型在实现的cpp内 进行一次实例化。这样在别的模块中使用时 也能链接通过
[/Quote]

用到的模板类型在实现的cpp内 进行一次实例化,什么意思?
回复
liyinlei 2010-08-05
VS不支持模板类分离编译。

一定要.h, .cpp分开的话,用到的模板类型在实现的cpp内 进行一次实例化。这样在别的模块中使用时 也能链接通过
回复
wade008 2010-08-05
这个还真的没见过

等高手解答
回复
雪影 2010-08-05
把代码贴出来 大家测试一下啊
回复
ls2141 2010-08-05
学习 ~~UP
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……