我试图调用基类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
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;
}
基类的大小函数
template<typename T>
int Array<T>::Size() const //returns size
{
return m_size;
}
答案 0 :(得分:8)
你需要使用this->Size()
,这有点尴尬,但这就是C ++的工作原理。当你从模板类派生时,编译器不会在声明点查看模板库的成员(基本上,在声明时,基本部分是未实例化的,编译器弄清楚它有点痛苦如果函数是在基类中定义的)。因此,默认行为是不在模板基类的范围内查找。
或者,您也可以使用using Array<T>::Size;
告诉编译器基类确实包含函数Size()
。
或者,作为最后一种选择,可以明确地调用Array<T>::Size()
。但是,无论何时处理虚函数,都不建议使用此替代方法,因为您无法以多态方式使用它们。