我正在尝试根据另一个类的模板类型创建模板化类的实例。但我收到以下错误。
error: template argument 1 is invalid
以下是重现错误的最小示例
template <typename IdType>
class GraphNode
{
IdType id;
};
template <typename IdType>
class Graph
{
public:
using NodeType = IdType;
GraphNode<IdType> nodes[100];
};
template <typename IdType>
class ProcessGraph
{
//some functions
};
template <typename IdType>
auto create_graph()
{
Graph<IdType> graph;
// populate graph here
return graph;
}
int main(int argc, char *argv[])
{
if(atoi(argv[1]))
const auto &graph = create_graph<int>();
else
const auto &graph = create_graph<unsigned long>();
auto processor = ProcessGraph<typename graph.NodeType>(); // The error occurs here
return 0;
}
感谢您的帮助
答案 0 :(得分:3)
您的代码中存在两个问题:
graph
变量在分支中具有不同的类型,并且在声明processor
时超出范围。
访问内部类型别名的语法错误。
您可以使用x
检索变量decltype(x)
的类型。由于graph
是引用,因此您需要使用std::remove_reference_t
删除引用。之后,您可以使用::NodeType
来检索内部类型别名。
if(atoi(argv[1]))
{
const auto &graph = create_graph<int>();
auto processor = ProcessGraph<
std::remove_reference_t<decltype(graph)>::NodeType>();
}
else
{
const auto &graph = create_graph<unsigned long>();
auto processor = ProcessGraph<
std::remove_reference_t<decltype(graph)>::NodeType>();
}
如果您想重构代码以避免重复,请将processor
变量初始化的代码放在template
函数中,该函数将graph
作为参数(或者使用用户定义的类型在其正文中创建graph
。