返回信息流//test.h
template<class T>
class A
{
public:
void fun() ;
};
#include "test.cpp"
//test.cpp
template<class T>
void A<T>::fun()
{
printf("hello") ;
}
按照c++ primer上的说法是可以的,不过有编译错误
test.cpp(3) : error C2143: 语法错误 : 缺少“;”(在“<”的前面)
这是为什么呢?还有什么办法可以将模板类的声明和实现分开呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #35332同步于 2010/1/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
模板类的包含编译模型错误
leelgl
2010/1/20镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
template<class T>
void A<T>::fun() //漏了作用域操作符
{
printf("hello") ;
}
【 在 leelgl 的大作中提到: 】
: //test.h
: template<class T>
: class A
: ...................
笔误了
不过问题不在这儿
【 在 Vampire 的大作中提到: 】
: template<class T>
: void A<T>::fun() //漏了作用域操作符
: {
: ...................
这样写不就已经是头文件和实现文件的分离了么?
你可以单独写一个源文件
#include "test.h"
int main() {
A<int> a;
a.fun();
return 0;
}
然后编译运行这个就可以使用模板了
那个test.cpp只需要被包含在头文件里面,当编译器
看到你代码中使用模板的时候能够找到模板的定义,从而
进行实例化
【 在 leelgl 的大作中提到: 】
: 笔误了
: 不过问题不在这儿
问题就是这样分离了编译出错,环境vs2005
合在一起肯定没问题
【 在 Vampire 的大作中提到: 】
: 这样写不就已经是头文件和实现文件的分离了么?
: 你可以单独写一个源文件
: #include "test.h"
: ...................
三个文件:
//test.h
template<class T>
class A {
public:
void fun() ;
};
#include "test.cpp"
//test.cpp
#include <cstdio>
template<class T>
void A<T>::fun()
{
printf("hello") ;
}
//foo.cpp
#include "test.h"
int main() {
A<int> a;
a.fun();
return 0;
}
只编译foo.cpp
【 在 leelgl 的大作中提到: 】
: 问题就是这样分离了编译出错,环境vs2005
: 合在一起肯定没问题
【 在 leelgl 的大作中提到: 】
: 问题就是这样分离了编译出错,环境vs2005
: 合在一起肯定没问题
你既然知道Primer那就先看16.8.2章。
然后看这篇文章:为什么C++编译器不能支持对模板的分离式编译
总的来说就是标准支持,编译器实现困难。
你那是第几版的呢?第四版似乎没有16.8。。。
在16.3讲了可以使用包含编译将声明和实现分离,VC也支持
我试了下,模板函数这样可以,但是模板类不行
【 在 ttplayer 的大作中提到: 】
: 你既然知道Primer那就先看16.8.2章。
: 然后看这篇文章:为什么C++编译器不能支持对模板的分离式编译
: 总的来说就是标准支持,编译器实现困难。