gpt4 book ai didi

c++ - 如何根据另一个类的类型声明一个类

转载 作者:行者123 更新时间:2023-11-30 02:30:04 25 4
gpt4 key购买 nike

我正在尝试基于另一个类的模板类型创建一个模板化类的实例。但是我收到以下错误。

错误:模板参数 1 无效

这是重现错误的最小示例

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;
}

感谢帮助

最佳答案

你的代码有两个问题:

  1. graph 变量在分支中具有不同的类型,并且在声明 processor 时超出范围。

  2. 访问内部类型别名的语法错误。


您可以使用decltype(x) 检索变量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 变量的代码放在获取 graphtemplate 函数中作为参数(或者在其正文中使用用户定义的类型创建graph)

关于c++ - 如何根据另一个类的类型声明一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39019975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com