Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ 为什么使用std::vector容器创建std::队列不会引发编译器错误_C++_Stl_Queue_Stdvector - Fatal编程技术网

C++ 为什么使用std::vector容器创建std::队列不会引发编译器错误

C++ 为什么使用std::vector容器创建std::队列不会引发编译器错误,c++,stl,queue,stdvector,C++,Stl,Queue,Stdvector,为什么使用std::vector容器创建std::queue不会引发编译器错误 编译器错误仅在调用pop时发生(这很清楚,因为vector不提供pop\u front()) #包括 #包括 #包括 使用名称空间std; int main() { 排队等候; s、 推(10); cout因为类模板的成员函数在被调用之前不会被隐式实例化 从$14.7.1/2隐式实例化[temp.inst]: 除非类模板或成员模板的成员已 显式实例化或显式专门化,专门化 当指定专门化时,隐式实例化成员的 在要求成员定

为什么使用
std::vector
容器创建
std::queue
不会引发编译器错误

编译器错误仅在调用pop时发生(这很清楚,因为vector不提供
pop\u front()

#包括
#包括
#包括
使用名称空间std;
int main()
{
排队等候;
s、 推(10);

cout因为类模板的成员函数在被调用之前不会被隐式实例化

从$14.7.1/2隐式实例化[temp.inst]:

除非类模板或成员模板的成员已 显式实例化或显式专门化,专门化 当指定专门化时,隐式实例化成员的 在要求成员定义存在的上下文中引用

和/4:

[ Example:
template<class T> struct Z {
void f();
void g();
};
void h() {
Z<int> a; // instantiation of class Z<int> required
Z<char>* p; // instantiation of class Z<char> not required
Z<double>* q; // instantiation of class Z<double> not required
a.f(); // instantiation of Z<int>::f() required
p->g(); // instantiation of class Z<char> required, and
// instantiation of Z<char>::g() required
}
[示例:
模板结构Z{
无效f();
void g();
};
void h(){
Z a;//需要实例化类Z
Z*p;//不需要实例化类Z
Z*q;//不需要实例化类Z
a、 f();//需要实例化Z::f()
p->g();//需要实例化类Z,并且
//需要实例化Z::g()
}
和/11:

实现不应隐式实例化函数 模板、变量模板、成员模板、非虚拟成员 函数、成员类或类模板的静态数据成员 这不需要实例化


什么是“非默认std::vector”?@KerrekSB:意思是std::vector不是队列的默认容器(即std::deque).无论如何,编辑了标题。是的,更清晰。好吧,创建工作。是
pop
不起作用,所以你在那里得到了错误。打电话很好。这似乎是一个实现质量问题。绝对值得。是否严格必要是一个我无法回答的问题,尽管在我看来,标准建议可能是这样。我确实需要我不认为这解释了为什么不需要诊断,如果我正确阅读§23.6.3.1/1,这似乎意味着实际上需要诊断:“任何支持操作的序列容器……都可以用于实例化
队列
”-这是否意味着不能使用其他容器来实例化
队列
?@KonradRudolph是的,容器必须满足这些要求,因此不能使用其他标准容器(不过,您可以自己制作)。这是C++17中概念将要做的事情之一(最后).@KonradRudolph如果你不调用
pop()
,它将不会被实例化,因此没有人试图调用
向量上不存在的
pop_front()
。因此这取决于你对它的使用。@songyuanyao我认为这与此无关。该类必须检查是否满足要求(例如,通过
static_assert
)当类被实例化时,不是编译器(这是不允许的,因为您引用的段落)。我认为这个答案是错误的。至少,类在实例化时肯定可以诊断这个问题,而你的答案暗示情况并非如此。@KonradRudolph:如果它不是未定义的,那么它是什么?你引用的句子没有说“仅序列容器…”。它没有添加,“其他的不能”。它只是指定可以使用支持这些操作的序列容器。因此它肯定不是格式错误;它只能是未指定或未定义的。此外,标准库实现只需要与规范一致;它是(显式的)允许额外实现其他功能(或在标准不要求的情况下产生可预测的结果)。
[ Example:
template<class T> struct Z {
void f();
void g();
};
void h() {
Z<int> a; // instantiation of class Z<int> required
Z<char>* p; // instantiation of class Z<char> not required
Z<double>* q; // instantiation of class Z<double> not required
a.f(); // instantiation of Z<int>::f() required
p->g(); // instantiation of class Z<char> required, and
// instantiation of Z<char>::g() required
}