Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建从STL集合继承的新类时出现的错误 我是一个C++新手,想完成C++的任务。在代码问题中,我无法更改主函数中的任何内容,但可以在主函数之外添加代码_C++_Stl - Fatal编程技术网

创建从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
课程对我来说没什么意义。