没有定义的类声明是否作为模板参数有效

时间:2017-09-05 13:02:44

标签: c++ templates

使用类的标识符(仅声明但未定义)作为模板参数和模板特化是否有效。

类似的东西:

template<typename T>
class NodeInfo;

template<typename T>
class GraphInfo;

template<typename T>
class Graph {
public:
    GraphInfo<T> graphInfo;
    NodeInfo<T> nodeInfo;
};


// specialisation
class ContextInfo;

template <>
class NodeInfo<ContextInfo> {
public:
    int a, b, c;

};

template <>
class GraphInfo<ContextInfo> {
public:
    int a, b, c;
};



int main() {
   Graph<ContextInfo> g;
}

这在gcc 7中没有任何警告就编译好了,但是我想知道这是否是一个有效的事情,或者我是否创建了某种未定义的行为?

2 个答案:

答案 0 :(得分:3)

这是fine in principle

  

[注意:模板类型参数可能是不完整的类型(6.9)。 - 结束说明]

但是,除非另有说明,否则类型may not be used with the standard library不完整:

  在以下情况下,[p]效果未定义:[...]
   - 如果在实例化模板组件时将不完整类型(6.9)用作模板参数,   除非特别允许该组件。

例如:

  

knex().from('table_A').raw('sum(column_A * column_B) as column_c') 的模板参数T可能是不完整的类型。

从C ++ 17开始,更多的图书馆设施允许使用不完整的类型; for example vector

  

如果分配器满足分配器完整性,则在实例化declval时可以使用不完整类型T   要求。 vector在完成专业化的任何成员之前应完成   引用了矢量。

答案 1 :(得分:1)

是的,它很好。允许将不完整类型用作template argument

  

类型模板参数的模板参数必须是type-id,可以命名为不完整类型