C++ Primer 答客問 (43) - default value for c …
C++ Primer 答客問 (43) - default value for class template parameter
侯捷 jjhou@ccca.nctu.edu.tw
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: jjhou@ccca.nctu.edu.tw
CompBook 近期熱門文章
PTT數位生活區 即時熱門文章