对此的修复可能非常简单,但我找不到答案。谢谢和我的眼泪将给予答案。
基本上下面的代码在没有模板的情况下运行得很好(当然T' s作为基元)但是一旦我添加了模板,它就说我的参数列表丢失了。我认为这与声明有关,但这些功能并没有使用范围分辨率,至少不是我熟悉的方式。我如何让它工作?
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;
}
如果你很好奇,该程序应该采用字符串(或其他类型)和优先级并对优先级进行排序,程序不完整,但我应该这样做在我的程序中使用此类,但我将其转换为模板时绊倒了。
答案 0 :(得分:3)
std::set
期待类型。
在介绍模板部分之前,Foo
是一种类型。
现在这是一个模板类,Foo
不再是一个类型了。 Foo<int>
是一种类型; Foo<std::string>
是一种类型;不是Foo
。
所以
std::set<Foo<int>> s;
可以工作,
std::set<Foo> s;
给出错误。
答案 1 :(得分:1)
当您声明class Foo {};
时,Foo
是类的名称。但是,当您声明template <class T> class Foo {};
时,Foo
是模板的名称。 模板不是类:它是创建类的秘诀。 Foo<int>
或Foo<char>
等类。
您似乎希望将std::string
存储在集合中的Foo
中,这意味着代码应如下所示:
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;
}