C2679结构上下文

时间:2016-11-26 22:26:14

标签: c++ set

你好堆栈溢出我从stl设置有问题,我的问题是:

输入:

3
2,2,3
American Beauty#2002
Iron Man#2012
Interstellar#2014
Iron Man#2012
Inception#2010
Forrest Gump#1994
Iron Man#2012

SetTask2.h:

#pragma once
#include <set>
#include <vector>
#include <iostream>
#include <string>
#include <fstream>
#include <iterator>
#include <algorithm>

using namespace std;

struct Movie {
    string movieName;
    int movieYear;
};

bool operator<(const Movie& m1, Movie& m2);
void SetTask2();

SetTask2.cpp:

    #include "SetTask2.h"

bool operator<(const Movie& m1, Movie& m2) {
    return m1.movieYear <= m2.movieYear;
}

void SetTask2() {
    ifstream in("SetTask2.in");
    int numberOfPersons;
    in >> numberOfPersons;

    vector<set<Movie>> preferences;

    string prefNumberS;
    in >> prefNumberS;
    for (int i = 0; i < prefNumberS.size(); i++) {
        if (prefNumberS[i] != ',') {
            int number = (int)prefNumberS[i] - 48;

            string mName;
            string mYear;

            Movie m;
            set<Movie> s;

            for (int j = 0; j < number; j++)
            {
                getline(in, mName, '#');
                getline(in, mYear, '\n');
                m.movieName = mName;
                m.movieYear = stoi(mYear);

                s.insert(m);
                preferences.push_back(s);
            }
        }
    }
}

Main.cpp的:

#include "SetTask2.h"

using namespace std;

int main()
{

    SetTask2(); // Set : Task 2

    return 0;
}

然后我收到此错误:

错误C2679二进制&#39;&lt;&#39;:找不到带有&#39; const Movie&#39;类型的右手操作数的运算符(或者没有可接受的转换)

你能告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

  

错误C2679二进制'&lt;':找不到运算符,它接受'const Movie'类型的右手操作数(或者没有可接受的转换)

您的operator<仅针对左侧 const Movie&定义,您需要对其进行修改以制作右侧操作数{ {1}}。

我注意到使用const覆盖的数字<=运算符可能会在排序时引入意外行为。如果您打算按年度对电影进行排序,请返回<,而不是m1.year < m2.year

m1.year <= m2.year

此外,请勿在头文件中使用bool operator < (const Movie& left, const Movie& right) { return left.movieYear < right.movieYear; } 。它会导致头文件的使用者受到范围污染,并可能引入命名冲突。如果您查看最终的using namespace翻译单元,您会看到您有两次Main.cpp语句。