为什么用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;
}
答案 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:
实现不应隐式实例化函数 模板,变量模板,成员模板,非虚拟成员 函数,成员类或类模板的静态数据成员 这不需要实例化。