我试图调用基类Array的Size()函数.Clang的错误是"使用未声明的标识符'Size'".下面是我的NumericArray标题,源文件中的函数定义和基类中的函数定义.非常感谢您的帮助.
派生标题
#ifndef NUMERICARRAY_H
#define NUMERICARRAY_H
#include "array.h"
namespace Cary
{
namespace Containers
{
template<typename T>
class NumericArray: public Array<T>
{
public:
NumericArray<T>(); //default constructor
~NumericArray<T>(); //destructor
NumericArray<T>& operator = (const NumericArray<T>& array1); //assignment operator
NumericArray<T>& operator * (double factor) const; //scale
NumericArray<T>& operator + (const NumericArray<T>& array1) const; //add
};
}
}
#endif
Run Code Online (Sandbox Code Playgroud)
cpp中的函数定义
template<typename T>
NumericArray<T>& NumericArray<T>::operator * (double factor) const //scale
{
NumericArray<T> scale(Size());
for (int i = 0; i < Size(); i++)
scale[i] = factor * ((*this).GetElement(i));
return scale;
}
Run Code Online (Sandbox Code Playgroud)
基类的大小函数
template<typename T>
int Array<T>::Size() const //returns size
{
return m_size;
}
Run Code Online (Sandbox Code Playgroud)
你需要使用this->Size(),这有点尴尬,但这就是C++的工作原理.当你从模板类派生时,编译器不会在声明点查看模板库的成员(基本上,在声明时,基本部分是未实例化的,编译器弄清楚它有点痛苦如果函数是在基类中定义的).因此,默认行为是不在模板基类的范围内查找.
或者,您也可以使用using Array<T>::Size;告诉编译器基类确实包含该函数Size().
或者,作为最后一种选择,可以明确地调用Array<T>::Size().但是,无论何时处理虚函数,都不建议使用此替代方法,因为您无法以多态方式使用它们.
顺便说一下,Scott Meyers的有效C++中有一整章(第43项)(参见The Definitive C++ Book Guide and List)专门针对这个问题.