看板CompBook
标 题C++ Primer 答客问 (43) - default value for class template parameter
发信站清华资讯(枫桥驿站) (Sat Mar 25 22:40:39 2000)
转信站Ptt!bbs.ee.ntu!freebsd.ntu!News.Math.NCTU!news.cs.nthu!maple
C++ Primer 答客问 (43) - default value for class template parameter
侯捷
[email protected]
2000.03.25 第一次发表於
清大.枫桥驿站(140.114.87.5).电脑书讯版(Computer/CompBook)
本文将於日後整理於 侯捷网站/侯捷译作/C++ Primer 中文版/答客问
侯捷网站:www.jjhou.com
----------------------------------------------------------------
上课时,同学问了一个问题。
p817 提到 class template 的 template parameters 预设值。
给予 class Buffer 两个宣告式如下:
template <class Type, int size = 1024> // (1)
class Buffer;
template <class Type = string, int size> // (2)
class Buffer;
编译器会让它通过。同学问,如果 (1)(2) 次序颠倒将如何?
另一个问题是,所有 template parameters 都给予预设值,
可以吗?如何使用?
关於第一个问题,(1)(2) 次序颠倒可以吗?想像中一定可以,
结果 BCB4 却否定了它(真糟糕!)VC6 and G++ OK.
关於第二个问题,所有 template parameters 都给予预设值,
可以吗?答案是可以。如何使用?答案是用时不必给任何 template argument。
详见以下范例。
// 本例测试 class template 的 template parameters 是否
// 可以全部拥有 default value。答案:可。
#include <string>
using namespace std;
// 以下两个 declarations,先 (1) 後 (2),则 vc6[o], bcb4[o], g++[o]
// 以下两个 declarations,先 (2) 後 (1),则 vc6[o], bcb4[x], g++[o]
// bcb4 error msg 如下:
// Error E2260 : Default value missing following parameter 'Type' <- 指(2)
// Error E2148 : Default argument value redeclared for parameter 'size <- 指(1)
template <class Type, int size = 1024> // (1)
class Buffer;
template <class Type = string, int size> // (2)
class Buffer;
// 如果保持 (1)(2) 次序,再加 (3),则 vc6[o], bcb4[o], g++[o]
// 但若将 (3) 改为 template <class Type, int size = 1024>,
// 则 vc6[o], bcb4[x], g++[x]
// G++ error msg 如下:
// redefinition of default argument for `int const size' <- 指(3)
// bcb4 error msg 如下:
// Error E2148 : Default argument value edeclared for parameter 'size <- 指(3)
template <class Type, int size> // (3)
class Buffer
{ };
int main()
{
// 在 (1)(2)(3) 的情况下
Buffer<> b; // fine.
}
--
※ Origin: 枫桥驿站<bbs.cs.nthu.edu.tw> ◆ Mail: [email protected]