gpt4 book ai didi

c++ - 模板:父类成员变量在继承类中不可见

转载 作者:IT老高 更新时间:2023-10-28 12:32:52 34 4
gpt4 key购买 nike

我有以下 4 个文件:

  1. arrayListType.h:声明并定义arrayListType类为模板
  2. unorderedArrayListType.h:继承自arrayListType类,声明并定义unorderedArrayListType为模板。
  3. main1.cpp:测试程序来测试unorderedArrayListType 类。
  4. 生成文件

当访问 unorderedArrayListType 中的 arrayListType 的 protected 变量时,我得到一个编译错误,例如:“长度未在此范围内声明”,“列表未在此范围内声明scope”,其中 length 和 list 是 arrayListType 类中的 protected 变量。

以下是代码:
数组列表类型.h

#ifndef H_arrayListType  
#define H_arrayListType

#include <iostream>

using namespace std;

template <class elemType>
class arrayListType
{

public:

const arrayListType<elemType>&operator=(const arrayListType<elemType>&);

bool isEmpty() const;
bool isFull() const;
int listSize() const;
int maxListSize() const;
void print() const;
bool isItemAtEqual(int location, const elemType& item) const;
virtual void insertAt(int location, const elemType& insertItem) = 0;
virtual void insertEnd(const elemType& insertItem) = 0;
void removeAt(int location);
void retrieveAt(int location, elemType& retItem) const;
virtual void replaceAt(int location, const elemType& repItem) = 0;
void clearList();
virtual int seqSearch(const elemType& searchItem) const;
virtual void remove(const elemType& removeItem) = 0;

arrayListType(int size = 100);
arrayListType(const arrayListType<elemType>& otherList);

virtual ~arrayListType();


protected:

elemType *list;
int length;
int maxSize;
};


template <class elemType>
bool arrayListType<elemType>::isEmpty() const
{
return (length == 0);
}

// remaining non-virtual functions of arrayListType class

#endif

unorderedArrayListType.h

#ifndef H_unorderedArrayListType
#define H_unorderedArrayListType

//#include <iostream>
#include "arrayListType.h"

//using namespace std;

template <class elemType>
class unorderedArrayListType: public arrayListType<elemType>
{

public:

void insertAt(int location, const elemType& insertItem);
void insertEnd(const elemType& insertItem);
void replaceAt(int location, const elemType& repItem);
int seqSearch(const elemType& searchItem) const;
void remove(const elemType& removeItem);

unorderedArrayListType(int size = 100);
};

template <class elemType>
void unorderedArrayListType<elemType>::insertAt(int location, const elemType& insertItem)
{
for(int i = length; i > location; i--)
list[i] = list[i - 1];

list[location] = insertItem;
length++;
}

// Remaining virtual functions that need to be defined by the inherited class

#endif

main1.cpp

#include <iostream>
#include "unorderedArrayListType.h"

using namespace std;


int main()
{
unorderedArrayListType<int> intList(25);

int number;
cout<<"Line 3: Enter 8 integers: ";

for(int count = 0; count < 8; count++)
{
cin>>number;
intList.insertEnd(number);
}

cout<<"Line 8: intList: ";
intList.print();
cout<<endl;
}

生成文件:

all: main1


main1.o: main1.cpp
g++ -c -Wall main1.cpp

main1: main1.o
g++ -Wall main1.o -o main


clean:
rm -f *.o *~ main1

以下是编译错误:

make  
g++ -c -Wall main1.cpp
In file included from main1.cpp:2:
unorderedArrayListType.h: In member function 'void unorderedArrayListType<elemType>::insertAt(int, const elemType&)':
unorderedArrayListType.h:30: error: 'length' was not declared in this scope
unorderedArrayListType.h:31: error: 'list' was not declared in this scope
unorderedArrayListType.h:33: error: 'list' was not declared in this scope

unorderedArrayListType 的更多函数列出和 protected 变量表示为未在范围内声明。想知道可能是什么错误。

新错误:

make  
g++ -Wall main1.o -o main
Undefined first referenced
symbol in file
arrayListType<int>::seqSearch(int const&) constmain1.o
ld: fatal: Symbol referencing errors. No output written to main
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `main1'

最佳答案

这是因为模板类的模板父级在首先检查模板的编译过程中没有实例化。这些名称似乎不依赖于特定的模板实例化,因此需要提供定义。 (如果您从不查看 arrayListType 的定义,那么阅读 unorderedArrayListType 的代码会发现 listlength 需要是某种全局变量。)

您需要明确告诉编译器名称实际上取决于父级的实例化。

一种方式,使用 this->在所有继承的名称之前:this->list , this->length .

另一种方式,使用声明:using arrayListType<elemType>::length;等(例如在派生类的私有(private)部分)。


关于此的常见问题解答条目:https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members

关于c++ - 模板:父类成员变量在继承类中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592512/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com