Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译时没有错误?(返回的类型没有';子类化声明的返回类型)_C++_Inheritance - Fatal编程技术网

C++ 为什么编译时没有错误?(返回的类型没有';子类化声明的返回类型)

C++ 为什么编译时没有错误?(返回的类型没有';子类化声明的返回类型),c++,inheritance,C++,Inheritance,我继承了std::list以允许使用[]操作符进行“psuedo随机访问” #include <list> template <typename T> class rlist : public std::list<T> { T& operator[](int index){ typename std::list<T>::iterator iterator; int pos; for (

我继承了
std::list
以允许使用
[]
操作符进行“psuedo随机访问”

#include <list>
template <typename T>
class rlist : public std::list<T> {
    T& operator[](int index){
        typename std::list<T>::iterator iterator;
        int pos;
        for (iterator = this->begin(), pos = 0; iterator != this->end(); iterator++, pos++)
            if (pos == index)
                return *iterator;
        return inexistent_element();
    }

    class inexistent_element {

    };
};
#包括
模板
类rlist:public std::list{
T&运算符[](整数索引){
typename std::list::迭代器迭代器;
int pos;
对于(迭代器=this->begin(),pos=0;迭代器!=this->end();迭代器++,pos++)
if(pos==索引)
返回*迭代器;
返回不存在的_元素();
}
类不存在元素{
};
};
inexistent\u元素
尚未继承
T
,因此不应编译该元素。但它是编译的。我也非常肯定C++不允许我通过非const引用来创建一个内联的对象。
我正在使用Code::Blocks IDE和MinGW gcc编译器。我想知道为什么要编译它。

您从未实例化过成员函数
运算符[]
。我怎么知道的?这是私人的

请注意,实例化类不会自动实例化其成员函数([temp.inst]/1):

类模板专门化的隐式实例化会导致 声明的隐式实例化,但不是 类成员函数的定义或默认参数, 成员类、作用域成员枚举、静态数据成员和 成员模板


您从未实例化过成员函数
运算符[]
。我怎么知道的?这是私人的

请注意,实例化类不会自动实例化其成员函数([temp.inst]/1):

类模板专门化的隐式实例化会导致 声明的隐式实例化,但不是 类成员函数的定义或默认参数, 成员类、作用域成员枚举、静态数据成员和 成员模板


显然,正如其他人所指出的,您从未实际实例化
操作员[]
;编译器不需要诊断没有法律依据的情况 实例化是可能的,不同的编译器或多或少是不同的 在这方面很有侵略性。(MSC在没有诊断的情况下几乎什么都不会诊断 实例化;g++将诊断大多数没有法律依据的情况 实例化。)

当然,函数也可能有合法的实例化。
inexisting\u元素
可能没有基类,但
T
可能有基类 非显式构造函数,通过常量引用获取不存在的元素 在知道
T
之前,编译器不能合法地拒绝此代码;i、 e.会议
函数已经实例化。

显然,正如其他人指出的,您从未实际实例化
操作员[]
;编译器不需要诊断没有法律依据的情况 实例化是可能的,不同的编译器或多或少是不同的 在这方面很有侵略性。(MSC在没有诊断的情况下几乎什么都不会诊断 实例化;g++将诊断大多数没有法律依据的情况 实例化。)

当然,函数也可能有合法的实例化。
inexisting\u元素
可能没有基类,但
T
可能有基类 非显式构造函数,通过常量引用获取不存在的元素 在知道
T
之前,编译器不能合法地拒绝此代码;i、 e.会议
函数已实例化。

是否确实已在代码中的某个位置实例化了此
运算符[]
函数?如果实例化函数,编译器错误肯定会出现。但无论如何,这门课看起来是个非常非常糟糕的主意。最大的问题是,如果希望使用
[]
进行随机访问,为什么要使用
std::list
。如果确实需要,那么就不要继承。创建一个独立的函数,该函数采用
std::list
int
索引。使用模板时,除非实际使用,否则不会像使用非模板类那样出现如此多的错误。在C++11中,此代码变得毫无意义,因为
std::list
具有一个恒定的时间
size()
函数,您可以简单地将
size()
std::next(begin(),n)
组合起来。您确定在代码中的某个地方实例化了此
运算符[]
函数吗?如果实例化该函数,编译器错误肯定会出现。但无论如何,这门课看起来是个非常非常糟糕的主意。最大的问题是,如果希望使用
[]
进行随机访问,为什么要使用
std::list
。如果确实需要,那么就不要继承。创建一个独立的函数,该函数采用
std::list
int
索引。使用模板时,除非实际使用,否则不会像使用非模板类那样出现如此多的错误。在C++11中,此代码变得毫无意义,因为
std::list
具有一个恒定的时间
size()
函数,您可以简单地组合
size()
std::next(begin(),n)
。为什么是私有的?如果它是公共的,它会改变什么吗?@user3834459我刚才说你不能实例化(使用)它,因为它是私有的。如果它是公开的,你可以用它,不是吗?好的,这是有道理的。谢谢,为什么是私人的?如果它是公共的,它会改变什么吗?@user3834459我刚才说你不能实例化(使用)它,因为它是私有的。如果它是公开的,你可以用它,不是吗?好的,这是有道理的。谢谢