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

时间:2015-08-15 13:51:31

标签: c++ stl queue stdvector

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

编译器错误仅在调用pop时发生(这很明显,因为vector不提供pop_front())。

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    queue<int, vector<int>> s;

    s.push(10);

    cout << s.front() << endl;

    s.pop();

    return 0;
}

DEMO

1 个答案:

答案 0 :(得分:5)

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

$ 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
}

和/ 11:

  

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