请教:在VC中使用类模板,需要如何设置编译器才能编译通过?

ah__fu 2005-04-03 03:39:26
大家好:
小弟尝试着写一个类模板,但是出现很多编译问题,在此向大家请教。

我首先定义了一个类模板:
//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的窗口程序中包含这个类,也要出现编译错误!

谢谢大家!
...全文
338 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jronald 2005-04-04
  • 打赏
  • 举报
回复
加了,没错啊
我用vs.net2003编译的
erben 2005-04-04
  • 打赏
  • 举报
回复
星星不要用了两天VS就看不起VC,你仔细看楼主的代码了 吗
------------------
回复人: oyljerry(【勇敢的心】→ ㊣Warm up,A za!㊣) ( ) 信誉:120 2005-04-04 18:22:00 得分: 0


vs对于模板的支持比vc好多了


Practise_Think 2005-04-04
  • 打赏
  • 举报
回复
类模板的代码必须要写在同一个H文件中,不然的话编译不通过
oyljerry 2005-04-04
  • 打赏
  • 举报
回复
vs对于模板的支持比vc好多了
jronald 2005-04-04
  • 打赏
  • 举报
回复
把代码贴出来吧
ah__fu 2005-04-04
  • 打赏
  • 举报
回复
我在VS.NET2003下面编译还是出问题啊
朋友们,再帮帮忙了!这个问题还是没有解决了
最好能够写出CL.EXE的命令行编译方式
ah__fu 2005-04-03
  • 打赏
  • 举报
回复
jronald(深白色)兄,你在定义对象后加一句:
objTest.Add1(123);

又会出问题了
jronald 2005-04-03
  • 打赏
  • 举报
回复
不信看我的
//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;
}
jronald 2005-04-03
  • 打赏
  • 举报
回复
贴出来看看
jronald 2005-04-03
  • 打赏
  • 举报
回复
我通过了
ah__fu 2005-04-03
  • 打赏
  • 举报
回复
jronald(深白色) 兄
我把实现写在一个文件里面了,还是通不过啊!
请朋友们帮帮忙啊,难道VC里面你们都不用类模板的吗?
nonocast 2005-04-03
  • 打赏
  • 举报
回复
VC6本身就支持模板滴
只是不是很好
不过你上面的错误应该和VC无关
jronald 2005-04-03
  • 打赏
  • 举报
回复
终于找到了
用模板时,要分离定义与实现用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文件中
菜牛 2005-04-03
  • 打赏
  • 举报
回复
写得不对吧。
jronald 2005-04-03
  • 打赏
  • 举报
回复
我在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

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧