游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9042|回复: 17

求各位先知指点一下,为啥不能特化类模板的函数成员模

[复制链接]

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2007-10-23 05:03:00 | 显示全部楼层 |阅读模式

比如:

template<typename T>
class CNode
{

template<typename TS_TYPE>
void Translate(const Vec3&, TS_TYPE);
};

struct _TS_LOCAL{};

//然后,特化 Translate

template<typename T>
template<>
void CNode<T>::Translate<_TS_LOCAL>(const Vec3&, _TS_LOCAL) {
  //....
}

vs2005不认了鸟,是不是俺哪写错了

输出:
error C2768: “CNode<T>::Translate”: 非法使用显式模板参数
error C2768: “CNode<T>::Translate”: 非法使用显式模板参数
error C2244: “CNode<T>::Translate”: 无法将函数定义与现有的声明匹配
        定义
        'void CNode<T>::Translate<_TS_LOCAL>(const Vec3 &,_TS_LOCAL)'
        现有声明
        'void CNode<T>::Translate(const Vec3 &,TS_TYPE)'
[em7]

0

主题

199

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2007-10-23 16:09:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

特化模板函数这样写在vs2003上也通不过

这样写是能通过的
struct _TS_LOCAL{};

template<typename T>
class CNode
{
public:
        template<typename TS_Type>
        void Translate(TS_Type);
        void Translate(_TS_LOCAL);
};

template<typename T>
template<typename TS_Type>
void CNode<T>::Translate(TS_Type)
{
}
template<typename T>
void CNode<T>::Translate(_TS_LOCAL)
{
}

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2007-10-23 17:13:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员



对于楼主的这个问题,本人查找了一些相关资料,可以确定的说:

template<> 必须在template<typename X>的外围.

这也许不是那么灵活,但是语法就是如此.
如果要向楼主那样做,只能给定某个CNode<X>的Translate<>特化.

template<> //只能针对某个CNode特化
template<>
void CNode<void>::Translate<_TS_LOCAL>(const Vec3&, _TS_LOCAL) {
  //....
}

ps.某种层度上,这样也比较直观.

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2007-10-23 18:25:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

用的语法还真是先进那,呵呵。我宁愿在Translate内部再用个traits.

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
 楼主| 发表于 2007-10-23 21:24:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

恩啊,受教了。
航天大哥,会查资料好哇,俺就查不到……,这个Translate<T>()与CNode<T>的类型无关,如果每个CNode<T>的都特化一份,就只能靠Ctrl+C & Ctrl+V了,本想靠模板偷点懒,没想到被模板奴役了?

2楼:哎呀,是啊,那样就可以了呀,我是模板得走火入魔了鸟,晕
4楼:见笑了,相比stl内部那些给机器认的符号,我这个还是很原始的人类语言

ps:C++四通八达,也让人找不找路。

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
 楼主| 发表于 2007-10-23 22:00:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

dev C++的提示倒还干脆,
enclosing class templates are not explicitly specialized

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
 楼主| 发表于 2007-10-23 22:17:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

4楼justlikethewind,请你告诉我你如何在Translate内部再用个traits,我所能想到的:

定义个一友元
template<typename TC, typename TS_TYPE>
void TranslateImpl(CNode<TC> *_this,  TS_TYPE) {
}

还是没法针对TS_TYPE特化吧? 貌似函数模板没法部分特化

或者把Tanslate()用到的CNode的成员变量传TranslateImpl,这样可以把参数_this削掉,
但也不能保证这些成员都不是成员模板撒

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
 楼主| 发表于 2007-10-23 22:54:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

functors ?

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2007-10-23 23:48:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

回楼主,我认为你完全没有必要用友元函数模板。
你只要把需要对TS_TYPE类型进行的操作与CNode类型隔离开,用传统的traits类模板来完成转调就好了。实在需要引用CNode实例的地方,传一个functor给traits来抽象这个操作。

这么说,不知道你理解我的意思没有?

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
 楼主| 发表于 2007-10-24 00:00:00 | 显示全部楼层

Re:求各位先知指点一下,为啥不能特化类模板的函数成员

struct Vec3{
public:
        float x,y,z;
};

struct _TS_LOCAL{} TS_LOCAL;
struct _TS_PARENT{} TS_PARENT;
struct _TS_WORLD{} TS_WORLD;

class CNodeAccessary {};
template<typename TC, typename TS_TYPE>
class TTranslateImpl :public CNodeAccessary
{
public:
        void operator()(TC *_this, TS_TYPE);
};

template <typename TC>
class CNode
{
public:

        template<typename TS_TYPE>
        void Translate(TS_TYPE trait) {
                TTranslateImpl<TC,TS_TYPE>(this, trait);
        }
protected:
        Vec3 m_Pos;
};

template<typename TC>
class TTranslateImpl<TC, _TS_LOCAL>
{
public:
        TTranslateImpl(CNode<TC> *_this, _TS_LOCAL) {
                // -test
                //this _this->m_Pos.x += 1.0f;
                printf("_TS_LOCAL\n");
        }
};
template<typename TC>
class TTranslateImpl<TC, _TS_PARENT>
{
public:
        TTranslateImpl(CNode<TC> *_this, _TS_PARENT) {
                printf("_TS_PARENT\n");
        }
};

template<typename TC>
class TTranslateImpl<TC, _TS_WORLD>
{
public:
        TTranslateImpl(CNode<TC> *_this, _TS_WORLD) {
                printf("_TS_WORLD\n");
        }
};


void main()
{
        CNode<void> node;
        node.Translate(TS_LOCAL);
        node.Translate(TS_WORLD);
        node.Translate(TS_PARENT);
}

恩,我这样写,可以编译了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 03:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表