std :: sort / Работает в тестовом коде, но не может вывести шаблон в противном случае - PullRequest
0 голосов
/ 03 мая 2018

Я хочу отсортировать собственные векторы по их собственным значениям, и я использую собственные. Я попробовал следующий пост ( Сортировка собственных векторов по их собственным значениям (связанная сортировка) ), но он не может быть скомпилирован с MS VisualStudio 2015.

Так что я полагаю, что это не может быть , что трудно. Мне просто нужно отсортировать по собственным значениям, отследить их старый и новый порядок, а затем прибегнуть к матрице собственных векторов.

Это хорошо работает в моем тестовом коде:

#include <algorithm>
struct a
{
    double num1;
    int num2;
};

bool acompare(a lhs, a rhs) { return lhs.num1 < rhs.num1; }

int demoSortWithStructure()
{
    a array[5];

    array[0].num1 = 1;
    array[0].num2 = 1;

    array[1].num1 = 5;
    array[1].num2 = 2;

    array[2].num1 = 3;
    array[2].num2 = 3;

    array[3].num1 = 2;
    array[3].num2 = 4;

    array[4].num1 = 4;
    array[4].num2 = 0;

    cout << "before sort" << endl;
    for (int i = 0; i < 5; i++)
        cout << array[i].num1 << "\t" << array[i].num2 << endl;

    std::sort(array, array + 5, acompare);

    cout << "\n\nafter sort" << endl;

    for (int i = 0; i < 5; i++)
        cout << array[i].num1 << "\t" << array[i].num2 << endl;

    return 1;
}

Итак, я продолжил обобщать код следующим образом:

void MyClass::SortEigenValuesAndEigenMatrix(VectorXcd eigenvalue, MatrixXcd eigenvector)
{
    VectorXcd eigenvalueOriginal = eigenvalue;
    MatrixXcd eigenvectorOriginal = eigenvector;
    int noValues = eigenvalue.rows();
    a *array = new a[noValues];

    for (int iValue = 0; iValue < noValues; iValue++)
    {
        array[iValue].index = iValue;
        array[iValue].valueReal = eigenvalue(iValue).real();
    }

    sort(array[0], 
        array[noValues], 
        acompare);

    for (int iValue = 0; iValue < noValues; iValue++)
    {
        int indexNew = array[iValue].index;
        eigenvalue(iValue) = eigenvalueOriginal(indexNew);
        eigenvector.col(iValue) = eigenvectorOriginal.col(indexNew);
    }

}

Для контекста мои собственные значения и собственные векторы определены как сложные, но они являются реальными значениями. Итак, я просто беру реальное значение и собираюсь отсортировать на основе реальных (подписанных) значений.

Компилятор выдает следующую ошибку:

Severity    Code    Description Project File    Line    Suppression State
Error   C2784   'std::complex<_Other> std::operator -(const _Ty &,const std::complex<_Other> &)': could not deduce template argument for 'const std::complex<_Other> &' from 'a'    testRCWA    d:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm    3203    

Я не понимаю. Как компилятор может вывести использование

std::complex

А как насчет моего шаблона неясно? Я должен явно объявить тип при использовании сортировки? Почему это происходит в этом коде, а не когда он изолирован?

1 Ответ

0 голосов
/ 03 мая 2018

Каким-то образом включение определения структуры в файл включения приводит к неоднозначности в шаблонах. Я не уверен как, но это было решено путем помещения структуры (и логического сравнения) в определение класса.

Немного ответа ... но проблема решена.

...