类模板的默认参数问题 -- 困惑中

guolihui112 2008-08-04 09:15:28
基于讨论,写了下面一个测试程序,主要是测试编译期的模板问题:-----

#include <iostream>

template <typename type1 = int ,
typename type2 = char >
class A
{
};

template <typename type1= int,
typename type2 = A> // !!!!!!!!!!!!!!!!!!!!
struct B
{
public:
void test()
{
std::cout << "---" << typeid( type2 ).name() << std::endl;
}
};

int main()
{
B<int> cb;
cb.test();
return 0;
}


可以发现编译错误信息:

// aaa.cpp(22) : error C3203: “A”: 未专用化的类 模板 不能用作 模板 变量,该变量属
// 于 模板 参数“type2”,应为 real 类型


于是当上述错误位置改为

template <typename type1= int,
typename type2 = A <> > // !!!!!!!!!!!!!!!!!!!!
struct B

编译成功了!看来类模板默认参数中若含有类模板参数,得作此处理才行。接下来再看下一个版本 ( 只改了下main函数):

int main()
{
B cb;
cb.test();
return 0;
}

呜呼!错误:---

// aaa.cpp(22) : error C2955: “B”: 使用类 模板 需要 模板 参数列表
// aaa.cpp(18) : 参见“B”的声明
// aaa.cpp(22) : error C2133: “cb”: 未知的大小
// aaa.cpp(22) : error C2512: “B”: 没有合适的默认构造函数可用
// aaa.cpp(23) : error C2662: “B<type1,type2>::test”: 不能将“this”指针从“B”转
// 换为“B<type1,type2> &”
// 原因如下: 无法从“B”转换为“B<type1,type2>”
// 转换要求第二个用户定义的转换运算符或构造函数

令人大失所望,难道 上面的类 B 就不能使用全部的默认参数的权利吗?
小弟困惑良久,忘大侠指点
...全文
656 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
guolihui112 2008-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 matrixdwy 的回复:]
为什么B明明是模板,实例化的时候却不加 <>,LZ你不是没事找事吗。。。。
[/Quote]

呵呵 小弟刚学模板编程不久,见笑了
xkyx_cn 2008-08-04
  • 打赏
  • 举报
回复

int main()
{
// 声明B时使用空的模板参数即可
B<> cb;
cb.test();
return 0;
}
matrixdwy 2008-08-04
  • 打赏
  • 举报
回复
为什么B明明是模板,实例化的时候却不加<>,LZ你不是没事找事吗。。。。
guolihui112 2008-08-04
  • 打赏
  • 举报
回复
对了 ,上面程序是vs2005 的cl命令行编译,也在g++ 试过

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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