模板实例化时通常不允许使用不完整类型,但即使未明确使用不完整类型,这种情况是否仍然存在? gcc 5.1和VS 2015允许它,但我不确定。例如:
template<typename T>
struct B{
// not using T
};
struct tag1{};
struct tag2; // incomplete
using C1 = B<tag1>;
using C2 = B<tag2>;
using C3 = B<struct tag3>; // hmm...
int main(){
C1 c1;
C2 c2;
C3 c3;
}
额外奖励:上面tag3
怎么办?
修改: 以回应建议的重复,std::vector
与B
相比,使用了模板参数。看一下接受的答案:这是允许的,但关于vector
的问题不是。
答案 0 :(得分:3)
是的,您可以使用不完整类型作为模板类型参数 - 前提是您永远不要在需要完整类型的上下文中使用该类型参数。当您希望模板参数区分两个不同的类模板时,这很方便 - 但实际上并不需要它用于其他任何类模板。
由于B
永远不会尝试对需要完整的T
执行任何操作,因此它的所有三个实例都是C1
,C2
和{{1} })是完全有效的。