【问题标题】:Adding a template to a class, that's being used in a multiset向一个类中添加一个模板,该模板在一个多集中使用
【发布时间】:2017-10-20 18:26:45
【问题描述】:

解决这个问题可能很简单,但我找不到答案。回答将得到我的感谢和我的眼泪。

基本上,下面的代码在没有模板的情况下也可以正常工作(当然,使用 T 作为原语)但是一旦我添加了模板,它就会说我的参数列表丢失了。我认为这与声明有关,但这些函数没有使用范围解析,至少不是以我熟悉的方式。我如何让它发挥作用?

template<class T>
class Foo
{
public:
    Foo(T s, int i) : Data(s), pri(i) {}

    //Overload the relational operator so that the priority is compared.
    bool operator < (const Foo<T>& n) const { return n.pri < pri; }
    T getData() { return Data; }
    int getId() { return pri; }

private:
    T Data;
    int pri;
};

这是主要的

int main(void)
{
    set<Foo> s; //These should actually be multiset, but was trying to get it to
    s.insert(Foo("C++", 9)); //work as a set before jumping to multiset
    s.insert(Foo("Is ", 7));
    s.insert(Foo("Fun ", 3));

    set<Foo>::iterator p;
    for (p = s.begin(); p != s.end(); p++)
    {
        Foo n = *p;
        cout << "Id: " << n.getId() << "\t Data: " << n.getData() << endl;
    }

    return 0;
}

如果您好奇,该程序应该采用字符串(或其他类型)以及优先级并对优先级进行排序,程序不完整,但我应该在我的程序中使用这个类,但我在将其转换为模板时被绊倒了。

【问题讨论】:

  • Foo n = *p; 模板类需要模板参数?
  • 请注意,C++ 中的编译器错误会告诉您错误发生在哪。查找错误消息中首次提及您的代码。

标签: c++ list function templates


【解决方案1】:

std::set 期望一个类型

在引入模板部分之前,Foo 是一个类型。

现在这是一个模板类,Foo 不再是一个类型。 Foo&lt;int&gt; 是一个类型; Foo&lt;std::string&gt; 是一个类型;不是Foo

所以

std::set<Foo<int>> s;

可以工作,

std::set<Foo> s;

给出一个错误。

【讨论】:

    【解决方案2】:

    当您声明class Foo {}; 时,Foo 是一个类的名称。但是,当您声明template &lt;class T&gt; class Foo {}; 时,Foo模板的名称。 模板不是类:它是创建类的秘诀。 Foo&lt;int&gt;Foo&lt;char&gt; 等类。

    您似乎想将std::strings 存储在集合中的Foos 中,这意味着代码应如下所示:

    int main(void)
    {
        set<Foo<string>> s; //These should actually be multiset, but was trying to get it to
        s.insert(Foo<string>("C++", 9)); //work as a set before jumping to multiset
        s.insert(Foo<string>("Is ", 7));
        s.insert(Foo<string>("Fun ", 3));
    
        set<Foo<string>>::iterator p;
        for (p = s.begin(); p != s.end(); p++)
        {
            Foo<string> n = *p;
            cout << "Id: " << n.getId() << "\t Data: " << n.getData() << endl;
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多