| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1129 人关注过本帖
标题:关于一个较复杂的类模板的演绎问题
取消只看楼主 加入收藏
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:4 
关于一个较复杂的类模板的演绎问题
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
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
收藏
得分:0 
楼上的没给出答案呀,函数的定义当然有了,你看程序了么?
2010-05-29 23:37
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
lsrwan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:17
注 册:2009-10-11
收藏
得分:0 
现在已经明白了,这里确实是只有声明,没有定义,迷失的木桶讲的是对的,这似乎是作者的一个通用做法,对于简单的例子,只给出声明.
void fppm(void (X<N>::*p)(typename X<N>::I)){}; //这里加括号能编译通过               
fppm(&X<33>::f);  // fine: N deduced to be 33
至于这两句,我是这样理解typename X<N>::I实际是演绎 类X中函数f的形参int,例如声明函数指针作为形参,一般这样
double fun(float (*pfun)(double))实际上 X<N>::*p和*pfun是对应的,(typename X<N>::I)和)(double)是对应的.
(&X<33>::f就是一个函数指针,至于说函数指针不能取地址,我没看到那里有这个限制.
演绎过程如下:
由于33是int型,因此&X<33>::f被演绎为  &X<int>::f(int X<int>::int)  因此是可以别正确演绎的,而
fppm(&X<33.5>::f); 是不能被演绎的.

[ 本帖最后由 lsrwan 于 2010-5-30 20:40 编辑 ]
2010-05-30 20:29
快速回复:关于一个较复杂的类模板的演绎问题
数据加载中...
 
   



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

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