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

时间:2016-08-18 13:49:50

标签: c++

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

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

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

您的代码中存在两个问题:

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

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

  3. 您可以使用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