我是C ++的新手并试图完成C ++任务。在代码问题中,我无法更改main函数中的任何内容,但可以在main函数之外添加代码。
这是主要的:
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;
}
为了得到正确的答案,我的想法是创建一个名为MySet
的新STL类,它继承自STL集,似乎MyPrint()
函数有一些错误。我真的不知道这是什么。
BTW,我在VS2010 Pro中编译代码。错误信息是:
未解析的外部符号&#34; void __cdecl MyPrint(class std :: _ Tree_const_iterator,class std :: allocator,0&gt;&gt;&gt;,class std :: _ Tree_const_iterator,class std :: allocator,0&gt;&gt;&gt; ;)&#34; (?MyPrint @@ YAXV?$ _ Tree_const_iterator @ V'$ _ Tree_val @ V'$ _ Tset_traits @ NU?$更少@ N @ @@ STD V'$分配器@ N @ 2 @ $ 0A @@ STD @@@ STD @@函数_main
中引用了@ std @@ 0 @ Z)我的片段是:
template<typename T, class Compare = less<T>, class Alloc = allocator<T> >
class MySet:public set<T>
{
private:
T st[100];
public:
MySet():set<T>() {}
MySet(int *first, int *last)
{
int *idx = first;
for(int i = 0; idx <= last; ++idx, ++i)
st[i] = *idx;
}
pair<typename set<T>::iterator, typename set<T>::iterator>FindInterval(int lower, int upper)
{
typename set<T>::iterator low, up;
low = lower_bound(lower);
up = upper_bound(upper);
return (pair<typename set<T>::iterator, typename set<T>::iterator>(low, up));
}
void friend MyPrint(typename set<T>::iterator first_, typename set<T>::iterator last_);
};
template<typename T>
void MyPrint(typename MySet<T>::iterator first_, typename MySet<T>::iterator last_)
{
typename MySet<T>::iterator it = first_;
for(; it != last_; ++it)
cout << *it << " ";
}
MyPrint()
函数只打印MySet
中的所有元素。
我已经问过所有知道C ++的人,但似乎他们无法帮助我......而且我被困了3天以上......
谢谢!
亦如
答案 0 :(得分:1)
您的程序声明了两个函数 - 或者说两个函数系列 - 名为MyPrint
。首先,有一组非模板friend
函数,每个函数用于MySet
模板的每个实例化。其次,有一组MyPrint
模板的实例化。但是你只提供第二组的实际实现。
对于MyPrint
中的main
调用,两个集合都是可行的候选者,而其他条件相同,编译器更喜欢非模板到模板。然后链接器发现非模板缺少实现。
围绕它有两种方法。您可以在类中实现非模板,然后删除模板:
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)
{ ... }