在类中使用函数模板,这个程序有什么问题。

playboxer 2003-11-14 07:17:28
#include "stdafx.h"

#include <iostream.h>

class CProperty{
public:
CProperty(){
}
template <class T>
T getValue(){
return _value;
}
template <class T>
void setValue( T _value){
value = _value;
}
template <class T> T _value;
};


main()
{
CProperty p;
p.setValue( (int)512 );

int i = p.getValue();
return 0;
}
编译错误:
C:\test\test6\test6.cpp(51) : error C2783: 'T __thiscall CProperty::getValue(void)' : could not deduce template argument for 'T'

大家也看出来,我想干什么了。
怎么解决这个问题呢?
谢谢?
...全文
47 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
playboxer 2003-11-14
  • 打赏
  • 举报
回复
继续讨论吧,我晚点结贴!
playboxer 2003-11-14
  • 打赏
  • 举报
回复
大漠苍狼不由引天长嚎:
短哥果然是高手!!!!
短歌如风 2003-11-14
  • 打赏
  • 举报
回复
setValue中漏了一句:

template < class T >
void setValue(T _value)
{
(this->*destroy_fun)();
destroy_fun = &CProperty::NoDestroy;
value = new T(_value);
  destroy_fun = &CProperty::Destroy<T>;
}

不然会有内存泄漏。
playboxer 2003-11-14
  • 打赏
  • 举报
回复
plainsong(短歌):
你的办法应该行得通,明天我到公司用其它编译工具试下。
但第二种办法在VC6下没调通,可能是我的问题。
谢谢
短歌如风 2003-11-14
  • 打赏
  • 举报
回复
注意C++不能通过返回值来确定模板化参数,必须用模板显式特化语法。
如果在VC6中,由于不支持成员模板的显式实例化,必须:
template<typename T>
void getValue(T& _value)
{
_value = *reinterpret_cast<T*>(value);
}
调用时:
p.getValue(i);
或者
template<typename T>
T getValue(T*)
{
return *reinterpret_cast<T*>(value);
}
调用时:
i = p.getValue((int*)0);
短歌如风 2003-11-14
  • 打赏
  • 举报
回复
class CProperty
{
void * value;
void( CProperty::* destroy_fun ) ();

template <typename T >
void Destroy();

void NoDestroy();

public:
CProperty() : destroy_fun( &CProperty::NoDestroy )
{
}
~CProperty()
{
(this->*destroy_fun)();
}
template < class T >
T getValue()
{
return * reinterpret_cast <T*> (value );
}

template < class T >
void setValue(T _value)
{
(this->*destroy_fun)();
value = new T(_value);
}
};



template < typename T >
void CProperty::Destroy()
{
delete reinterpret_cast < T * > ( value );
}

void CProperty::NoDestroy()
{
}

#include <iostream>
#include <string>
int main()
{
CProperty p;
p.setValue(1);
std::cout <<p.getValue<int>()<<std::endl;
p.setValue(std::string("abcdefg"));
std::cout <<p.getValue<std::string>() << std::endl;
}
playboxer 2003-11-14
  • 打赏
  • 举报
回复
浪帆:
如果定义成一个模板类,问题早就解决了,我的本意不是这样的。
谢谢
zhouqingyuan 2003-11-14
  • 打赏
  • 举报
回复
你的问题是,int i = p.getValue();右边是T的,而左边是int型,无法转化。
zhouqingyuan 2003-11-14
  • 打赏
  • 举报
回复


#include <iostream.h>
template <class T>
class CProperty{
public:
CProperty(){
}

T getValue(){
return _value;
}

void setValue( T value){
_value =value;
}
T _value;
};


int main()
{
CProperty<int> p;
p.setValue( (int)512 );

int i = p.getValue();
return 0;
}
改成这样就可以了
playboxer 2003-11-14
  • 打赏
  • 举报
回复
MaiCle(【拉磨去了】) :
如果使用了接口,但我的getValue的返回值怎么定义?
盼赐教!
MaiCle 2003-11-14
  • 打赏
  • 举报
回复
template <class T> T _value;

-- 可以再搞一个模板类来存放

如果是这样的话,你那两个SET和GET函数也可以放在这个模板里面,然后在你的这个类中写两个接口来封装他。

这样要改你现在的设计。
playboxer 2003-11-14
  • 打赏
  • 举报
回复
这一句确实有问题,我也看出来的。
但在不改变函数语义的情况下,如何解决呢?
playboxer 2003-11-14
  • 打赏
  • 举报
回复
有解决办法吗?
ThinkX 2003-11-14
  • 打赏
  • 举报
回复
template <class T> T _value;这句有问题的。

24,856

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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