使用类的标识符(仅声明但未定义)作为模板参数和模板特化是否有效。
类似的东西:
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中没有任何警告就编译好了,但是我想知道这是否是一个有效的事情,或者我是否创建了某种未定义的行为?
答案 0 :(得分:3)
[注意:模板类型参数可能是不完整的类型(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,可以命名为不完整类型