无法解析未声明的标识符 C++

Can't resolve undeclared identifier C++

我正在尝试调用基础 class 数组的 Size() 函数。来自 Clang 的错误是 "use of undeclared identifier 'Size'"。下面是我对 NumericArray 的 header、源文件中的函数定义和基 class 中的函数定义。非常感谢您的帮助。

派生header

#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;
        }

基数 class

的大小函数
template<typename T>
        int Array<T>::Size() const    //returns size
        {
            return m_size;
        }

你需要使用this->Size(),这有点尴尬,但这就是C++的工作方式。当你从模板派生时class,编译器不会在声明点查看模板基类的成员(基本上,在声明时,基类部分是未实例化的,这对编译器来判断该函数是否在基 class 中定义)。所以默认行为是不在模板基础 classes.

的范围内查找

或者,您也可以使用 using Array<T>::Size; 告诉编译器基 class 确实包含函数 Size()

或者,作为最后的选择,可以显式调用 Array<T>::Size()。但是,当您处理虚函数时,不推荐使用这种替代方法,因为您失去了多态使用它们的能力。

顺便说一句,Effective C++ by Scott Meyers(参见 The Definitive C++ Book Guide and List)有一整章(第 43 项)专门讨论这个问题。