more effective c++ Item M4
书上原文如下
class Array {
public:
class ArraySize { // 这个类是新的
public:
ArraySize(int numElements): theSize(numElements) {}
int size() const { return theSize; }
private:
int theSize;
};
Array(int lowBound, int highBound);
Array(ArraySize size); // 注意新的声明
...
};
这里把 ArraySize 嵌套入 Array 中,为了强调它总是与 Array 一起使用。你也必须声明ArraySize 为公有,为了让任何人都能使用它。 想一下,当通过单参数构造函数定义 Array 对象,会发生什么样的事情:
Array<int> a(10);
你的编译器要求用 int 参数调用 Array<int>里的构造函数,但是没有这样的构造函数。编译器意识到它能从 int 参数转换成一个临时 ArraySize 对象,ArraySize 对象只是Array<int>构造函数所需要的,这样编译器进行了转换。函数调用(及其后的对象建立)也就成功了。
#include <iostream>
using namespace std;
template <typename T>
class Array {
public:
class ArraySize { // 这个类是新的
public:
ArraySize(int numElements): theSize(numElements) {}
int size() const { return theSize; }
private:
int theSize;
};
Array(int lowBound, int highBound);
Array(ArraySize size){} // 注意新的声明
/*{
cout << "Constructed" << endl;
}*/
};
int main()
{
Array<int> a(10);
return 0;
}
请注意,如果构造函数Array(ArraySize size)函数体为空,编译器GCC4.5.2会提示:
undefined reference to `Array<int>::Array(Array<int>::ArraySize)'|
||=== Build finished: 1 errors, 0 warnings ===|