| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1129 人关注过本帖
标题:关于一个较复杂的类模板的演绎问题
只看楼主 加入收藏
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:11 
关于一个较复杂的类模板的演绎问题
C++ TEMPLATE中有如下一段程序,看它的解释是可以演绎的,但我用的vs2008怎么也编译通过不了,不知道什么原因,代码和解释都在下面,望前辈指正.
程序代码:
template <int N>
class X {
  public:
    typedef int I;
    void f(int) {
    }
};
//
template<int N>
void fppm(void (X<N>::*p)(typename X<N>::I));

int main()
{
    fppm(&X<33>::f);  // fine: N deduced to be 33
}

这是编译结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

Error    1    error LNK2019: unresolved external symbol "void __cdecl fppm<33>(void (__thiscall X<33>::*)(int))" (??$fppm@$0CB@@@YAXP8?$X@$0CB@@@AEXH@Z@Z) referenced in function _main    fppm.obj
Error    2    fatal error LNK1120: 1 unresolved externals    E:\C++Templates_examples\projects\fppm\Debug\fppm.exe
搜索更多相关主题的帖子: 模板 演绎 
2010-05-29 11:22
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:15 
template<int N>
void fppm(void (X<N>::*p)(typename X<N>::I));

只声明不定义,连接错误
2010-05-29 22:44
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
收藏
得分:0 
楼上的没给出答案呀,函数的定义当然有了,你看程序了么?
2010-05-29 23:37
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:0 
函数模板一般内联实现,你试一下
2010-05-29 23:59
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:2 
回复 楼主 lsrwan
请楼主注意,模板类一般要内联实现。

许多编译器都不支持分离模式。
我的编译器也不行。但不知道vc2008是否可以?
你试着用内联实现,试试看!

祝你好运!
有结果说一下。
谢谢

南国利剑
2010-05-30 00:45
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:3 

void fppm(void (X<N>::*p)(typename X<N>::I)){}; //这里加括号能编译通过               

fppm(&X<33>::f);  // fine: N deduced to be 33

但这两句,看了半天还真没看懂什么意思
第一句括号里有点像是函数指针 void (X<N>::*p)(typename X<N>::I)
但X<N>::*p这个用法是什么意思?再说p也没定义,突然冒出个p而且作用域符后跟取值符,好诡异的用法
还有typename 我见书上最多只是在模板参数里用到,今天第一次见到这样用的

还有就是 &X<33>::f 这个,看上去有点像取 函数f的地址,但我好像记得 函数指针不用加取地址符啊,真的好诡异

谁能帮忙解释一下这两句是什么意思?
2010-05-30 03:11
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:0 
函数的形参是一个类成员函数指针,就是那个P。&x<33>::f取类的成员函数指针。
2010-05-30 08:35
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:0 
Typename 是让编译器能够推导这是一个类型,否则编译器认为这是一个静态成员,
2010-05-30 08:38
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
收藏
得分:0 
现在感觉6楼的方法似乎可行,回去试下,也可能是文献的代码写错了,或年代比较老,原版是02年的,编译器这几年改进很多。例如它将以模板作为参数的模板两个尖括号要留空格,否则将认为是移位,但我的编译器却是不用空格的。再次感谢各位兄弟的帮忙,有了结果我一定贴出来。
2010-05-30 13:11
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
收藏
得分:0 
似乎迷失的木桶讲的很有道理,佩服!!!
2010-05-30 13:16
快速回复:关于一个较复杂的类模板的演绎问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013659 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved