创建从STL集继承的新类的错误

时间:2014-05-02 01:40:49

标签: c++ stl

我是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天以上......

谢谢!

亦如

1 个答案:

答案 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)
{ ... }