【问题标题】:C++ Passing a tempate typename class as function parameterC ++将模板类型名类作为函数参数传递
【发布时间】:2015-07-29 13:19:11
【问题描述】:

我需要将模板类作为参数传递给函数,但我可以检索函数内部的类型名以初始化临时变量

类声明如下:

template <typename Type> class ListIndex_Linked

这里是main中类的初始化和函数的调用

ListIndex_Linked<std::string> L;
insertion(L);

以及我想要做什么

template <class list <typename Type>>
void insertion( list<Type>& L ) 
{
    Type& temp = L.get(0); 
    {
        int max = L.numElem();
        for ( int i = 1, ; i < max; i++ )
        {

        }
    }
}

但我收到此错误:

error: 'list' is not a template
void insertion( list<Type>& L )
             ^

提前感谢您的帮助

【问题讨论】:

    标签: c++ templates parameter-passing typename


    【解决方案1】:

    如果insertion 只应该与ListIndex_Linked 一起使用,那么您可以将其编写为模板,如果列表的模板参数为:

    template <typename Type>
    void insertion(ListIndex_Linked<Type>& L) 
    {
      ...
    }
    

    否则,您可以使用模板模板参数:

    template<template<class> class List, class Type>
    void insertion(const List<Type>& L)
    {
      ...
    }
    

    【讨论】:

    • 不,我还有 3 个其他类可以使用插入功能,我之前做过并且工作过,但不是我需要的
    • @FernandoPereira 但这不是你的问题。您可以使用模板模板参数。我添加了一个示例。
    • 你是对的,我的错误我会在以后的问题中更具体,谢谢
    【解决方案2】:

    您没有正确地将list 声明为template template parameter

    template <template <typename> class list, typename Type>
    void insertion( list<Type>& L ) 
    {
      ...
    }
    

    参考:http://en.cppreference.com/w/cpp/language/template_parameters

    【讨论】:

    • 我明白了,很简单,谢谢,我尝试了模板和类型名的各种组合,但没有成功
    • @FernandoPereira 您可以查看this 了解更多信息。
    【解决方案3】:

    另一种方法是使用auto 不强制Type

    template <typename Container>
    void insertion(Container& L ) 
    {
        auto& temp = L.get(0); 
        {
            int max = L.numElem();
            for ( int i = 1, ; i < max; i++ )
            {
    
            }
        }
    }
    

    Container 内部还有 typedef 可能会有所帮助,例如

    typename Container::reference temp = L.get(0); // or Container::value_type&
    

    这需要类似:

    template <typename Type>
    class ListIndex_Linked
    {
    public:
        using value_type = Type;
        using reference = Type&;
        // ...
        // Your code
    };
    

    【讨论】:

    • 有趣的解决方案,下次试试看效果如何,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多