请教:在VC中使用类模板,需要如何设置编译器才能编译通过?
大家好:
小弟尝试着写一个类模板,但是出现很多编译问题,在此向大家请教。
我首先定义了一个类模板:
//file: MyClass.h
template <class MyType>
class MyClass
{
public:
MyClass(); //默认构造函数
MyClass(int value); //另外一个构造函数
~MyClass(); //析构函数
void Add(MyType value); //其中一个方法
private:
MyClass(const MyClass& lhs); //复制构造函数
MyClass& operator=(const MyClass& lhs); //赋值函数
//其他部分省略,主要不是逻辑问题,而是编译问题
};
//file:MyClass.cpp
#include "MyClass.h"
template <class MyType>
MyClass<MyType>::MyClass() //默认构造函数
{
//代码省略
}
template <class MyType>
MyClass<MyType>::MyClass(int value) //构造函数
{
//代码省略
}
template <class MyType>
void MyClass<MyType>::Add(MyType value) //其中一个方法
{
//代码省略
}
template <class MyType>
MyClass<MyType>::~MyClass() //析构函数
{
//代码省略
}
//=========================================
我单独编译MyClass.cpp,可以通过
cl.exe MyClass.cpp
然后,我测试这个类,结果编译不过
//file: main.cpp
#include <stdio.h>
#include "MyClass.h"
int main()
{
MyClass<char> objTest(1); //使用其中一个构造函数
return 1;
}
结果显示:
error LNK2001: unresolved external symbol
提示说MyClass(int value)和~MyClass()这两个成员有问题。
好,我改为调用另一个构造函数:
MyClass<char> objTest();
编译通过。
然后,我添加语句,调用方法:
objTest.Add('a');
结果又编译错误:
error C2228: left of '.Add' must have class/struct/union type
天哪,我简直要疯了!
请朋友们指教,我到底错在哪里!
我在MFC的窗口程序中包含这个类,也要出现编译错误!
谢谢大家!
问题点数:100、回复次数:15Top
1 楼jronald(深白色)回复于 2005-04-03 16:35:06 得分 0
我在vs.net2003下build也通不过,好像MyClass.cpp与main.cpp中成员函数的名字改编方式不一样
Linking...
main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyClass<char>::~MyClass<char>(void)" (??1?$MyClass@D@@QAE@XZ) referenced in function _main
main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyClass<char>::MyClass<char>(void)" (??0?$MyClass@D@@QAE@XZ) referenced in function _main
Top
2 楼Mackz(在相互)回复于 2005-04-03 16:43:28 得分 0
写得不对吧。Top
3 楼jronald(深白色)回复于 2005-04-03 16:58:53 得分 0
终于找到了
用模板时,要分离定义与实现用export关键字,这是c++标准说的,如
export template <class MyType>
class MyClass
{
public:
MyClass(); //默认构造函数
MyClass(int value); //另外一个构造函数
~MyClass(); //析构函数
void Add(MyType value); //其中一个方法
private:
MyClass(const MyClass& lhs); //复制构造函数
MyClass& operator=(const MyClass& lhs); //赋值函数
//其他部分省略,主要不是逻辑问题,而是编译问题
};
但是vc编译器不支持这个标准
所以只好把实现也写在.h文件中Top
4 楼nonocast(如果没有如果)回复于 2005-04-03 16:59:36 得分 0
VC6本身就支持模板滴
只是不是很好
不过你上面的错误应该和VC无关Top
5 楼ah__fu(阿福)回复于 2005-04-03 17:56:36 得分 0
jronald(深白色) 兄
我把实现写在一个文件里面了,还是通不过啊!
请朋友们帮帮忙啊,难道VC里面你们都不用类模板的吗?Top
6 楼jronald(深白色)回复于 2005-04-03 18:03:16 得分 0
我通过了Top
7 楼jronald(深白色)回复于 2005-04-03 18:04:39 得分 0
贴出来看看Top
8 楼jronald(深白色)回复于 2005-04-03 19:34:53 得分 0
不信看我的
//file: MyClass.h
template<class MyType>
class MyClass
{
public:
MyClass();
MyClass(MyType value); //另外一个构造函数
~MyClass();
void Add1(MyType value); //其中一个方法
protected:
private:
//MyClass(const MyClass& lhs); //复制构造函数
//MyClass& operator=(const MyClass& lhs); //赋值函数
//其他部分省略,主要不是逻辑问题,而是编译问题
};
//file:MyClass.cpp
//#include "MyClass.h"
template<class MyType> MyClass<MyType>::MyClass() //默认构造函数
{
//代码省略
}
template<class MyType> MyClass<MyType>::MyClass(MyType value) //构造函数
{
//代码省略
}
template<class MyType> void MyClass<MyType>::Add1(MyType value) //其中一个方法
{
//代码省略
}
template<class MyType> MyClass<MyType>::~MyClass() //析构函数
{
//代码省略
}
//file: main.cpp
//#include <stdio.h>
#include "MyClass.h"
int main()
{
MyClass<char> objTest(1); //使用其中一个构造函数
return 0;
}Top
9 楼ah__fu(阿福)回复于 2005-04-03 23:43:40 得分 0
jronald(深白色)兄,你在定义对象后加一句:
objTest.Add1(123);
又会出问题了Top
10 楼jronald(深白色)回复于 2005-04-04 11:11:01 得分 0
加了,没错啊
我用vs.net2003编译的Top
11 楼ah__fu(阿福)回复于 2005-04-04 16:30:39 得分 0
我在VS.NET2003下面编译还是出问题啊
朋友们,再帮帮忙了!这个问题还是没有解决了
最好能够写出CL.EXE的命令行编译方式Top
12 楼jronald(深白色)回复于 2005-04-04 16:40:37 得分 0
把代码贴出来吧Top
13 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 18:22:03 得分 0
vs对于模板的支持比vc好多了Top
14 楼Practise_Think(时代“过客”)回复于 2005-04-04 19:26:13 得分 100
类模板的代码必须要写在同一个H文件中,不然的话编译不通过Top
15 楼erben(于丹&易中天)回复于 2005-04-04 21:47:24 得分 0
星星不要用了两天VS就看不起VC,你仔细看楼主的代码了 吗
------------------
回复人: oyljerry(【勇敢的心】→ ㊣Warm up,A za!㊣) ( ) 信誉:120 2005-04-04 18:22:00 得分: 0
vs对于模板的支持比vc好多了
Top




