我有一个特征类,它指定类层次结构的基类和派生类。我正在尝试从嵌套在特征类中的类模板继承。
这是一个小例子:
template<typename GraphTypes, bool IsNode>
class Graph : public GraphTypes::BaseGraph<IsNode>
{};
class MyGraphTypes {
public:
template<bool IsNode>
class BaseGraph {};
};
Graph<MyGraphTypes, true> myGraph;
它可以在 GCC 上编译,但不能在 Clang 或 MSVC 上编译:
error C2143: syntax error: missing ',' before '<'
error: missing 'template' keyword prior to dependent template name 'GraphTypes::BaseGraph'
我在 MSVC 中确实需要它。这是一个错误或限制吗?或者我可以做些什么来让 MSVC 理解代码?
在这里你可以尝试一下:https://godbolt.org/z/8rTzGzxPG
Clang 在这里提供了比 MSVC 更好的错误消息。
BaseGraph
是一个依赖类型,因为它依赖于另一个模板参数。对于这些,您需要添加一个额外的 typename
,如下所示:
template<typename GraphTypes, bool IsNode>
class Graph : public GraphTypes::template BaseGraph<IsNode>
{};
这在 MSVC 上也能很好地编译。