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

kit*_*its 2 c++ templates

我试图调用基类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)

vso*_*tco 8

你需要使用this->Size(),这有点尴尬,但这就是C++的工作原理.当你从模板类派生时,编译器不会在声明点查看模板库的成员(基本上,在声明时,基本部分是未实例化的,编译器弄清楚它有点痛苦如果函数是在基类中定义的).因此,默认行为是不在模板基类的范围内查找.

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

或者,作为最后一种选择,可以明确地调用Array<T>::Size().但是,无论何时处理虚函数,都不建议使用此替代方法,因为您无法以多态方式使用它们.

顺便说一下,Scott Meyers的有效C++中有一整章(第43项)(参见The Definitive C++ Book Guide and List)专门针对这个问题.