不完整类型作为模板的标记类型

时间:2015-10-28 18:42:01

标签: c++ templates

模板实例化时通常不允许使用不完整类型,但即使未明确使用不完整类型,这种情况是否仍然存在? 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::vectorB相比,使用了模板参数。看一下接受的答案:这是允许的,但关于vector的问题不是。

1 个答案:

答案 0 :(得分:3)

是的,您可以使用不完整类型作为模板类型参数 - 前提是您永远不要在需要完整类型的上下文中使用该类型参数。当您希望模板参数区分两个不同的类模板时,这很方便 - 但实际上并不需要它用于其他任何类模板。

由于B永远不会尝试对需要完整的T执行任何操作,因此它的所有三个实例都是C1C2和{{1} })是完全有效的。