大家讨论一下,VC2005不支持那些C++标准语言特性!

zogy 2008-03-27 05:58:11
实际使用中,发现了两个,如下:

1、不支持成员模板的默认非类型参数:

template< int m = 0 > class Caa
{
public:
template< typename T = int > class Cbb {};
template< int n = 0 > class Ccc {};
};
Caa<>::Cbb<> g1; // ok
Caa<>::Ccc<> g2; // error

2、不支持两阶段查找(tow-phase lookup)

void Test(void)
{
cout << "1" << endl;
}
template< typename T > struct Caa
{
void Test(void)
{
cout << "2" << endl;
}
};
template< typename T > struct Cbb : public Caa< T >
{
int MemTest()
{
Test(); /* 根据标准,非依赖非受限的名称将马上查找;
此时依赖基类中的成员函数不确定;所以只能
找到全局的函数;GCC执行的是全局的函数;
可VC2005执行的却是是基类中的成员函数 */
this->Test(); /* 受限并依赖的名称只有到实例化时才查找;
此时会找到依赖基类中的成员函数。*/
return 0;
}
};
int g = Cbb< int >().MemTest();
...全文
405 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paidfighting 2008-04-02
  • 打赏
  • 举报
回复
lz真能研究。。。
zogy 2008-04-02
  • 打赏
  • 举报
回复
纯粹是学术研究,无趣的人不要打扰!
zogy 2008-04-02
  • 打赏
  • 举报
回复
对于第三条,还发现下述有趣问题;如果默认的模板的模板参数值的模板参数(有点绕!)是非类型的,则不会有语法错误,
但是结果却是错的;这应该算是个bug。

template< typename T > struct Caa
{
template< unsigned int nID > struct Cbb // 模板参数是非类型的
{
enum { Value = nID };
};
template< template< unsigned int > class TT = Cbb > struct Ccc
{
static int Show(void)
{
int i = TT< 100 >::Value;
cout << i << endl;
return i;
}
};
};
int i1 = Caa< int >::Ccc<>::Show(); // 应该是100,实际却是1
int i2 = Caa< int >::Ccc< Caa< int >::Cbb >::Show(); // 等于100是对的
taodm 2008-04-02
  • 打赏
  • 举报
回复
省点力气吧。
没人能探讨光,也没人能记全。
不要去穷究语言的细节,留点力气在比如OO方法啦,软件架构啦。。。
zogy 2008-04-02
  • 打赏
  • 举报
回复
3、不支持成员模板默认的模板的模板参数(默认值也是个成员模板)

template< typename T > struct Caa
{
template< typename T2 > struct Cbb // 如果这个模板是全局的,就不会有错
{
typedef T2 Result;
};
template< template< typename > class TT = Cbb > struct Ccc
{
typedef typename TT< int >::Result Type;
static Type Show(void)
{
Type i = Type();
cout << i << endl;
return i;
}
};
};
int i1 = Caa< int >::Ccc<>::Show(); // 语法错误
int i2 = Caa< int >::Ccc< Caa< int >::Cbb >::Show(); // 正确
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-27 05:58
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下