невозможно применить std :: set_intersection к различным типам структур с общим полем

Я пытаюсь использовать использованиестанд :: set_intersection найти общие элементы между двумя совершенно разными типами структур данных, имеющих общее связующее поле «имя».

Я посмотрел на следующеевведите описание ссылки здесь но, кажется, вынуждает меня выполнить маршрут между двумя различными типами структур, которых я пытался избежать (поскольку эти типы принадлежат сторонним производителям)

Фрагмент кода ниже показывает, чего я пытаюсь достичь.

// common field used for set intersection
typedef struct StructA {
    std::string mCommonField;
    float mFloatValue;
} StructA;

typedef struct StructB {
    std::string mCommonField;
    int mValue1;
    short mValue2;
} StructB;

// initially unsorted list
std::vector<StructA> aStructs = {{"hello", 1.0f}, {"goodbye", 2.0f}, {"foo", 3.0f}};
// initially unsorted list
std::vector<StructB> bStructs = {{"hello", 1, 2}, {"goodbye", 3, 4}, {"bar", 5, 6}};
// sorting both sets before calling std::intersection
std::sort(aStructs.begin(), aStructs.end(),
    [](const StructA& lhs, const StructA& rhs) {
        return lhs.mCommonField < rhs.mCommonField;
    });
std::sort(bStructs.begin(), bStructs.end(),
    [](const StructB& lhs, const StructB& rhs) {
    return lhs.mCommonField < rhs.mCommonField;
});

std::vector<StructA> intersection;
std::set_intersection(
    aStructs.begin(), aStructs.end(),
    bStructs.begin(), bStructs.end(),
    std::back_inserter(intersection),
    [](const StructA& lhs, const StructB& rhs){
        return lhs.mCommonField < rhs.mCommonField;
    });

Я использую Visual Studio 2013 для компиляции вышеупомянутого, однако приведенный выше код выдает множество ошибок, как показано ниже. Читая черезстанд :: set_intersection У меня проблема с сборкой совместимогоStrictWeakOrdering comp последний аргумент В идеале я хотел бы реализовать это как лямбда.

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class StrictWeakOrdering>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                                InputIterator2 first2, InputIterator2 last2,
                                OutputIterator result, 
                                StrictWeakOrdering comp);

1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ алгоритма (3591): ошибка C2664: 'bool (__vectorcall *) (const main :: StructA &, const main :: StructB &)' : невозможно преобразовать аргумент 1 из 'main :: StructB' в 'const main :: StructA &' 1>
Причина: невозможно преобразовать из 'main :: StructB' в 'const main :: StructA' 1> Нет доступного оператора преобразования, который может выполнить это преобразование, или оператор не может быть вызван 1>
C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ алгоритма (3625): см. Ссылку на создание экземпляра шаблона функции '_OutIt std :: _ Set_intersection <_InIt1, _InIt2, _OutIt, _Pr> (_ InIt1, _InIt1, _InIt2 , _InIt2, _OutIt, _Pr) 'компилируется 1> с 1> [1>
_OutIt = std :: back_insert_iterator >> 1>, _InIt1 = main :: StructA * 1>,
_InIt2 = main :: StructB * 1>, _Pr = main :: 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \gorithm (3654): см. Ссылку на создание экземпляра шаблона функции ' _OutIt std :: _ Set_intersection2 (_InIt1, _InIt1, _InIt2, _InIt2, _OutIt, _Pr, std :: true_type) 'компилируется 1> с 1> [1>
_OutIt = std :: back_insert_iterator >> 1>, _Pr = main :: 1>, _InIt1 = main :: StructA * 1>,
_InIt2 = main :: StructB * 1>] 1> .... \ src \ dlf \ main.cpp (111): см. Ссылку на создание экземпляра шаблона функции '_OutIt std :: set_intersection >>, std :: _ Vector_iterator >>, std :: back_insert_iterator >>, main ::> (_ InIt1, _InIt1, _InIt2, _InIt2, _OutIt, _Pr) 'компилируется 1> с 1> [1>
_OutIt = std :: back_insert_iterator >> 1>, _Ty = main :: StructA 1>,
_InIt1 = std :: _ Vector_iterator >> 1>,
_InIt2 = std :: _ Vector_iterator >> 1>, _Pr = main :: 1>]

Я также попытался использовать пользовательскую структуру компаратора для сравнения, но ошибки были еще более запутанными:

struct comparator {
    bool operator()(const StructA& lhs, const StructB& rhs) const {
        return lhs.mCommonField < rhs.mCommonField;
    }
    bool operator()(const StructB& lhs, const StructA& rhs) const {
        return lhs.mCommonField < rhs.mCommonField;
    }
};

std::vector<StructA> intersection;
std::set_intersection(
    aStructs.begin(), aStructs.end(),
    bStructs.begin(), bStructs.end(),
    std::back_inserter(intersection),
    comparator());

что привело к следующему подробному выводу ошибки. Я надеялся избежать настройки структур (так как фактические, которые я пытаюсь использовать, от сторонних производителей), чтобы иметь конвертеры из StructA в StructB и наоборот, есть ли способ, которым я могу избежать этого и просто иметь некоторую простую лямбду добиться простой привязки между 2 относительно простыми структурами с общим полем?
Заранее спасибо.

1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (521): ошибка C2664: 'bool main :: adaptor :: operator () (const main :: StructA &, const main: : StructB &) const ': невозможно преобразовать аргумент 1 из' main :: StructA 'в' const main :: StructB & '1> Причина: невозможно преобразовать из' main :: StructA 'в' const main :: StructB '1> Отсутствует пользовательский оператор преобразования, который может выполнить это преобразование, или оператор не может быть вызван 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (625): см. Ссылку на шаблон функции создание 'bool std :: _ Debug_lt_pred <_Pr, main :: StructA &, main :: StructA &> (_ Pr, _Ty1, _Ty2, std :: _ Dbfile_t, std :: _ Dbline_t)' компилируется 1> с 1> [1>
_Pr = основной :: компаратор 1>, _Ty1 = основной :: StructA & 1>, _Ty2 = основной :: StructA & 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (636): см. Ссылку на создание экземпляра шаблона функции 'void std :: _ Debug_order2 <_InIt, _Pr> (_ FwdIt, _FwdIt, _Pr, std :: _ Dbfile_t, std :: _ Dbline_t, std :: forward_iterator_tag)', компилируемый 1> 1 > [1>
_InIt = std :: _ Vector_iterator >> 1>, _Pr = основной :: компаратор 1>,
_FwdIt = std :: _ Vector_iterator >> 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \gorithm (3649): см. Ссылку на создание экземпляра шаблона функции 'void std :: _ Debug_order <_InIt1 , _Pr> (_ InIt, _InIt, _Pr, std :: _ Dbfile_t, std :: _ Dbline_t) 'компилируется 1> с 1> [1>
_InIt1 = std :: _ Vector_iterator >> 1>, _Pr = main :: компаратор 1>,
_InIt = std :: _ Vector_iterator >> 1>] 1> .... \ src \ dlf \ main.cpp (118): см. Ссылку на создание экземпляра шаблона функции '_OutIt std :: set_intersection >>, std :: _ Vector_iterator >> , std ::, back_insert_iterator >>, main ::compara> (_InIt1, _InIt1, _InIt2, _InIt2, _OutIt, _Pr) 'компилируется 1> с 1> [1>
_OutIt = std :: back_insert_iterator >> 1>, _Ty = main :: StructA 1>,
_InIt1 = std :: _ Vector_iterator >> 1>,
_InIt2 = std :: _ Vector_iterator >> 1>, _Pr = main :: компаратор 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (523): ошибка C2664: 'bool main :: comptor :: operator () (const main :: StructA &, const main :: StructB &) const ': невозможно преобразовать аргумент 1 из' main :: StructA 'в' const main :: StructB & '1> Причина : невозможно преобразовать из 'main :: StructA' в 'const main :: StructB' 1> Нет доступного оператора преобразования, который может выполнить это преобразование, или оператор не может быть вызван 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (521): ошибка C2664: 'bool main :: comptor :: operator () (const main :: StructA &, const main :: StructB &) const': невозможно преобразовать аргумент 2 из 'main :: StructB' в 'const main :: StructA &' 1> Причина: невозможно преобразовать из 'main :: StructB' в 'const main :: StructA' 1> Нет доступных пользовательских операторов преобразования, которые могли бы выполнить это преобразование, или оператор не может быть вызван 1> C: \ Program Files (x86) \ Microsoft Visual Studi o 12.0 \ VC \ include \ xutility (625): см. ссылку на создание экземпляра шаблона функции 'bool std :: _ Debug_lt_pred <_Pr, main :: StructB &, main :: StructB &> (_ Pr, _Ty1, _Ty2, std :: _ Dbfile_t, std :: _ Dbline_t) 'компилируется 1> с 1> [1>
_Pr = основной :: компаратор 1>, _Ty1 = основной :: StructB & 1>, _Ty2 = основной :: StructB & 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (636): см. Ссылку на создание экземпляра шаблона функции 'void std :: _ Debug_order2 <_InIt, _Pr> (_ FwdIt, _FwdIt, _Pr, std :: _ Dbfile_t, std :: _ Dbline_t, std :: forward_iterator_tag)', компилируемый 1> 1 > [1>
_InIt = std :: _ Vector_iterator >> 1>, _Pr = основной :: компаратор 1>,
_FwdIt = std :: _ Vector_iterator >> 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \gorithm (3650): см. Ссылку на создание экземпляра шаблона функции 'void std :: _ Debug_order <_InIt2 , _Pr> (_ InIt, _InIt, _Pr, std :: _ Dbfile_t, std :: _ Dbline_t) 'компилируется 1> с 1> [1>
_InIt2 = std :: _ Vector_iterator >> 1>, _Pr = основной :: компаратор 1>,
_InIt = std :: _ Vector_iterator >> 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include \ xutility (523): ошибка C2664: 'bool main :: comptor :: operator () (const main :: StructA &, const main :: StructB &) const ': невозможно преобразовать аргумент 2 из' main :: StructB 'в' const main :: StructA & '1> Причина: невозможно преобразовать из' main :: StructB 'to' const main :: StructA '1> Нет оператора пользовательского преобразования, который может выполнить это преобразование, или оператор не может быть вызван

Ответы на вопрос(3)

Ваш ответ на вопрос