2016-11-26 8 views
-1
私はSTLのセットで問題を抱えている

こんにちはスタックオーバーフローが、私の問題は次のとおりです。C2679は、構造体のコンテキスト

入力:

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「<」:なしオペレータは

タイプの右辺のオペランド 『のconst映画』取る(あるいは全く許容可能な変換はありません)が見つかりません

理由を教えてもらえますか?

+2

この問題を再現するのに十分なコードを投稿してください。私は 'std :: set'を使用しようとした後にエラーが' operator <'を定義している可能性があると思います。 – templatetypedef

+0

質問をファイルの内容で編集します。 – zVoxty

答えて

1

Error C2679 binary '<': no operator found which takes a right-hand operand of type 'const Movie' (or there is no acceptable conversion)

はあなたのoperator<のみ左側const Movie&のために定義されて、あなたは右手オペランド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翻訳単位を見ると、using namespace stdという文が2回あることがわかります。

+0

ありがとうございました!良い一日:D、私は第2パラメータのconstを忘れてしまった... – zVoxty