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

时间:2015-02-15 01:54:51

标签: 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

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

1 个答案:

答案 0 :(得分:8)

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

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

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

BTW,Scott Meyers的 Effective C ++ (见The Definitive C++ Book Guide and List)中有一整章(第43项)专门讨论这个问题。