成员函数摸版问题

旋风猴 2008-11-20 10:31:00
test.h===================
class A
{
virtual void Fun()
{
实现一
}
};
class B:public A
{
virtual void Fun()
{
实现二
}
};
class C:public B
... 实现三

class Realize
{
template <class T>
void Use(T obj)
{
obj.Fun();
}
};
main.cpp==================
Realize realize;
B b;
realize.Use(b);
目的是使用REalize的Use函数,传入不同的类对象都调用该对象自身的Fun函数.
没怎么用过模版,理解上应该是这样的,但是无法通过编译.应该怎么做才正确呢?
...全文
129 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
上面那个有个地方切割错了,重新发一下

//将3楼的代码改成以下结构.

//A.h==============================
#pragma once
#include <iostream>
using namespace std;
class A
{
public:
virtual void Fun();
};
//A.cpp=============================
#include "A.h"

void A::Fun()
{
puts("//实现1 ");

}
//B.h=============================
#pragma once
#include "A.h"

class B:public A
{
public:
virtual void Fun();
};
//B.cpp===========================
#include "B.h"

void B::Fun()
{
puts("//实现2 ");

}
//Realize.h=======================
#pragma once
#include "B.h"
class Reaize
{
public:
template <class T>
void Use(T &obj);
};
//Realize.cpp=====================
#include "Realize.h"

template <class T>
void Reaize::Use(T &obj)
{
obj.Fun();
}
//main.cpp======================
#include "Realize.h"

int main()
{
Reaize r;
B b;
r.Use(b);
return 0;
}
[/code]
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Reaize::Use <class B>(class B &)" (??$Use@VB@@@Reaize@@QAEXAAVB@@@Z),该符号在函数 _main 中被引用
1>C:\Documents and Settings\LiuQinXi\My Documents\Visual Studio 2005\Projects\d\Debug\d.exe : fatal error LNK1120: 1 个无法解析的外部命令
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
将3楼的代码改成以下结构.

//A.h==============================
#pragma once
#include <iostream>
using namespace std;
class A
{
public:
virtual void Fun();
};
//A.cpp=============================
#include "A.h"

void A::Fun()
{
puts("//实现1 ");

}
//B.h=============================
#pragma once
#include "A.h"

class B:public A
{
public:
virtual void Fun();
};
//B.cpp===========================
#include "B.h"

void B::Fun()
{
puts("//实现2 ");

}

#pragma once
#include "B.h"
//Realize.h=======================
class Reaize
{
public:
template <class T>
void Use(T &obj);
};
//Realize.cpp=====================
#include "Realize.h"

template <class T>
void Reaize::Use(T &obj)
{
obj.Fun();
}
//main.cpp======================
#include "Realize.h"

int main()
{
Reaize r;
B b;
r.Use(b);
return 0;
}

1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Reaize::Use<class B>(class B &)" (??$Use@VB@@@Reaize@@QAEXAAVB@@@Z),该符号在函数 _main 中被引用
1>C:\Documents and Settings\LiuQinXi\My Documents\Visual Studio 2005\Projects\d\Debug\d.exe : fatal error LNK1120: 1 个无法解析的外部命令
once_and_again 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 monkeykok 的回复:]
由于是伪代码,所以public不是什么问题,为了缩短行数.
错误为:
1>Main.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall CAnimation::GetCollide <class CAnimation>(class CAnimation *,bool)" (??$GetCollide@VCAnimation@@@CAnimation@@QAE_NPAV0@_N@Z),该符号在函数 "void __cdecl Render(void)" (?Render@@YAXXZ) 中被引用
1>D:\chaos\MyengineGame 11.19\Debug\engine.exe : fatal error LNK1120: 1 …
[/Quote]没有构造函数吧?
taodm 2008-11-20
  • 打赏
  • 举报
回复
那就贴你的真实代码。
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
3楼的 可以运行, 写法上是没什么问题.但是我工程里的就不行.再看看.
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taodm 的回复:]
又是用的VC6这个垃圾货编译器?
[/Quote]
用的是2005的编译器
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
由于是伪代码,所以public不是什么问题,为了缩短行数.
错误为:
1>Main.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall CAnimation::GetCollide<class CAnimation>(class CAnimation *,bool)" (??$GetCollide@VCAnimation@@@CAnimation@@QAE_NPAV0@_N@Z),该符号在函数 "void __cdecl Render(void)" (?Render@@YAXXZ) 中被引用
1>D:\chaos\MyengineGame 11.19\Debug\engine.exe : fatal error LNK1120: 1 个无法解析的外部命令
Mougou 2008-11-20
  • 打赏
  • 举报
回复
关于此帖,说句题外话:
楼主显然是在看“用模板避免多态带来的性能问题”,C++中的模板很猛、很强大。
chenzhp 2008-11-20
  • 打赏
  • 举报
回复
有可能你没有使用public,没有public类中的变量访问都是私有权限的。会引起问题
taodm 2008-11-20
  • 打赏
  • 举报
回复
又是用的VC6这个垃圾货编译器?
就呆在云上 2008-11-20
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
class A
{
public:
virtual void Fun()
{
puts("//实现1 ");
}
};
class B:public A
{
public:
virtual void Fun()
{
puts("//实现2 ");
}
};
class C:public B
{
public:
virtual void Fun()
{
puts("//实现3 ");
}
};

class Realize
{
public:
template <class T>
void Use(T &obj)
{
obj.Fun();
}
};

int main() {
Realize a;
C myc;
a.Use(myc);
}


因为你用的大都是默认的访问权限,class里面是私有的
你要用public:
Mougou 2008-11-20
  • 打赏
  • 举报
回复
加上public试试
Mougou 2008-11-20
  • 打赏
  • 举报
回复
错误是什么?
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
其实是可以分开两个文件写的,而且尝试在一个文件里写也不行.
其实只要在 CPP文件里实现一下模版就可以了.

//Realize.h=======================
class Reaize
{
public:
template <class T>
void Use(T &obj);
private:
void RegisterTemplate(); //目的是让函数模版在编译时生成二进制文件,只是编译用,任何时候都不需要调用
};
//Realize.cpp=====================
#include "Realize.h"

template <class T>
void Reaize::Use(T &obj)
{
obj.Fun();
}
void Reaize::RegisterTemplate() //虽然看起来比较傻但是可以解决问题 - -
{
A a;
B b;
C c;
Use(a);
Use(b);
Use(c);
}
就呆在云上 2008-11-20
  • 打赏
  • 举报
回复
#pragma once 
#include "B.h"
//Realize.h=======================
class Reaize
{
public:
template <class T>
void Use(T &obj);
};
//Realize.cpp=====================
#include "Realize.h"

template <class T>
void Reaize::Use(T &obj)
{
obj.Fun();
}


你的问题是因为.h和.cpp如果涉及到模板,是不能分开成两个文件来写的
呵呵
我还以为2005会傻到这个程度哦。
旋风猴 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 taodm 的回复:]
google 模板分离编译模式
[/Quote]

这句果然够精辟,而且有效解决了问题.但是我用的是"百度" ^_^
taodm 2008-11-20
  • 打赏
  • 举报
回复
google 模板分离编译模式

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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