templates: parent class member variables not visible in inherited class(模板:父类成员变量在继承类中不可见)
问题描述
我有以下 4 个文件:
I have the following 4 files:
- arrayListType.h:声明并定义- arrayListType类作为模板
- unorderedArrayListType.h:继承自- arrayListType类并声明并定义- unorderedArrayListType作为模板.
- main1.cpp:用于测试- unorderedArrayListType类的测试程序.
- Makefile
- arrayListType.h: Declare and define- arrayListTypeclass as a template
- unorderedArrayListType.h: Inherited from- arrayListTypeclass and Declares and defines- unorderedArrayListTypeas a template.
- main1.cpp: Test program to test- unorderedArrayListTypeclass.
- Makefile
在unorderedArrayListType 中访问arrayListType 的受保护变量时出现编译错误,例如:长度未在此范围内声明"、列表未在此范围内声明"scope",其中长度和列表是 arrayListType 类中的受保护变量.
I get a compile error saying when accessing the protected variables of arrayListType in unorderedArrayListType for example: "length not declared in this scope", "list not declared in this scope", where length and list are protected variables in arrayListType class. 
以下是代码:
arrayListType.h 
The following are the codes:
arrayListType.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
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 列出的更多函数和受保护的变量表示未在作用域中声明.想知道可能是什么错误.
More functions of unorderedArrayListType listed and protected variables indicated as not declared in the scope. Wondering what could be the error. 
新错误:
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的代码就会出现list和lengthcode> 需要是某种全局变量.)
This is because the template parent of a template class is not instantiated during the compilation pass that first examines the template. These names appear to be non-dependent on the particular template instantiation, and therefore the definitions need to be available. (If you never look at the definition of arrayListType, then reading the code of unorderedArrayListType it would appear the list and length need to be some sort of globals.)
您需要明确地告诉编译器这些名称实际上依赖于父项的实例化.
You'll need to tell the compiler explicitly that the names are in fact dependent on the instantiation of the parent.
一种方式,在所有继承的名字之前使用this->:this->list,this->length.
One way, using this-> before all the inherited names: this->list, this->length.
另一种方式,使用声明:using arrayListType 等(例如在派生类的私有部分).
Another way, using declarations: using arrayListType<elemType>::length; etc (for example in the private section of the  derived class).
关于此的常见问题解答:https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
A FAQ entry on this: https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
这篇关于模板:父类成员变量在继承类中不可见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:模板:父类成员变量在继承类中不可见
 
				
         
 
            
        基础教程推荐
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 常量变量在标题中不起作用 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
 
    	 
    	 
    	 
    	 
    	 
    	 
    	 
    	 
						 
						 
						 
						 
						 
				 
				 
				 
				