创建从STL集合继承的新类时出现的错误 我是一个C++新手,想完成C++的任务。在代码问题中,我无法更改主函数中的任何内容,但可以在主函数之外添加代码
主要内容如下:创建从STL集合继承的新类时出现的错误 我是一个C++新手,想完成C++的任务。在代码问题中,我无法更改主函数中的任何内容,但可以在主函数之外添加代码,c++,stl,C++,Stl,主要内容如下: int main() { MySet<int> stInt; int a[100]; int n; cin >> n; for(int i = 0;i < n; ++i ) cin >> a[i]; MySet<int> stInt(a,a+n); MyPrint(stInt.begin(),stInt.end()); cout <<
int main()
{
MySet<int> stInt;
int a[100];
int n;
cin >> n;
for(int i = 0;i < n; ++i )
cin >> a[i];
MySet<int> stInt(a,a+n);
MyPrint(stInt.begin(),stInt.end());
cout << endl;
int s,e;
cin >> s >> e;
pair<MySet<int>::iterator, MySet<int>::iterator> p;
p = stInt.FindInterval(s,e);
if( p.first != p.second)
{
MyPrint(p.first,p.second);
cout << endl;
}
else
cout << "Interval Not Found" << endl;
cin >> n;
MySet<double,greater<double> > stDouble;
for( int i = 0;i < n; ++i)
{
double d;
cin >> d;
stDouble.insert(d);
}
MyPrint(stDouble.begin(),stDouble.end());
cout << endl;
double w;
cin >> w;
cout << * stDouble.upper_bound(w) << endl;
return 0;
}
MyPrint()
函数只打印MySet
中的所有元素
我已经邀请了所有的人知道C++,但好像他们不能帮助我…我被困了三天多
谢谢
Yiru您的程序声明了两个函数,或者更确切地说,两个函数族,命名为
MyPrint
。首先,有一组非模板的friend
函数,用于MySet
模板的每个实例化。其次,有一组MyPrint
template的实例化。但您只提供第二组的实际实现
对于MyPrint
调用main
,这两个集合都是可行的候选集合,并且在其他条件相同的情况下,编译器更喜欢非模板而不是模板。然后链接器发现非模板缺少实现
有两种方法可以解决这个问题。您可以在类中实现非模板,然后删除模板:
template <typename T>
class MySet {
friend void MyPrint(...) { ... }
};
模板
类MySet{
朋友无效MyPrint(…){…}
};
或者您可以与模板成为朋友,并删除非模板:
template <typename T>
class MySet {
friend void MyPrint(...) { ... }
};
template <typename T>
void MyPrint(typename set<T>::iterator, typename set<T>::iterator);
template <typename T>
class MySet {
friend void MyPrint<T>(typename set<T>::iterator, typename set<T>::iterator);
};
template <typename T>
void MyPrint(typename set<T>::iterator, typename set<T>::iterator)
{ ... }
模板
void MyPrint(typename set::iterator,typename set::iterator);
模板
类MySet{
friend void MyPrint(typename set::iterator,typename set::iterator);
};
模板
void MyPrint(typename set::iterator,typename set::iterator)
{ ... }
这是一个链接器错误。这意味着您没有告诉链接器包含实现该自定义集的库。您好,谢谢您的建议。事实上,我已经添加了这个库……看起来您需要做的就是实现:void MyPrint(MySet::const_迭代器b,MySet::const_迭代器e)
这与STL无关,问题在于核心语言特性。在不使用单个STL类的情况下,构建一个遇到相同问题的示例是很容易的!现在我又遇到了另一个问题。。。我的默认设置是使用less来比较MySet中的元素。但主要有一句话:MySet stDouble。所以stDouble应该使用更大的。但是我的主要功能似乎仍然使用较少的。。。你知道怎么修吗?太多了MySet
接受三个模板参数,但只将其中一个传递给set
。另外两个从未使用过。我已将第二个模板参数添加到构造函数中,但它似乎是错误的。这是我的代码:MySet():set(){Pred pr=less;}编译器说这是错误的:c:\users\administrator\documents\visualstudio 2010\projects\coursera\u cpp\quizes\quize.cpp(14):在编译类模板成员函数“MySet::MySet(void)”时使用[T=int]有什么想法吗?谢谢!您需要类MySet:public set
。假设您首先要从std::set
派生。如果你不介意我问的话,这个练习的最终目标是什么?你的MySet
课程对我来说没什么意义。