C++ 模版编程
关键词 typename
下面是 Array2D<T> 类模版的下标操作符函数定义:
// 下标操作符函数
template <typename T>
Array2D<T>::RowArray Array2D<T>::operator[](int row) { // error
if ( row < 0 || row >= rows_ ) {
throw out_of_range("Array2D<T>: invalid row!");
}
return RowArray(*this, row);
}
template <typename T>
Array2D<T>::RowArray Array2D<T>::operator[](int row) { // error
if ( row < 0 || row >= rows_ ) {
throw out_of_range("Array2D<T>: invalid row!");
}
return RowArray(*this, row);
}
在编译程序时该函数定义所在行会产生下面的错误:
array2d.h:96: error: expected constructor, destructor, or type conversion before "Array2D"
这个错误的产生原因是编译器无法知道 RowArray 是 Array2D<T> 的内嵌类,而被误认为是一个 static 成员,解决办法就是在 Array2D<T>::RowArray 前面加上 typename 关键词,显示告诉编译器 Array2D<T>::RowArray 是一个类型。