无法解析未声明的标识符 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 项)专门讨论这个问题。
我正在尝试调用基础 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 项)专门讨论这个问题。