рекурсивный трейлинг-возврат типов Visual Studio 2010 - PullRequest
1 голос
/ 04 февраля 2012

Я только что обновился до vc ++ 2010 express с 2008 года, чтобы использовать возможности c ++ 11, но у меня возникают проблемы с использованием конечных типов возврата в рекурсивном перегруженном операторе.Я хочу взять два std :: vectors с произвольным числом измерений и добавить элементы, чтобы получить новый вектор.Однако я хочу иметь возможность разрешать добавление векторов целых к векторам двойных и т. Д. И автоматически получать правильный тип возврата - для этого требуется конечный тип возврата.Вот минимальный код, который воспроизводит ошибку и делает что-то полезное.

#include <vector>
#include <iostream>

template<class T, class U>
inline auto operator+(const std::vector<T> &a, const std::vector<U> &b) 
-> std::vector<decltype(T()+U())>
{
    std::vector<decltype(T()+U())> result;
    result.resize(std::min(a.size(),b.size()));
    for(unsigned int i=0; i<result.size(); ++i) result[i]=a[i]+b[i];
    return result;
}

int main()
{
    std::vector<std::vector<double> > mydoublevect2d(1);
    std::vector<std::vector<int> > myintvect2d(1);
    mydoublevect2d.resize(1);
    myintvect2d.resize(1);
    mydoublevect2d[0].push_back(1.0);
    myintvect2d[0].push_back(1);
    decltype(mydoublevect2d+myintvect2d) myothervect2d;
    myothervect2d=mydoublevect2d+myintvect2d;
    std::cout << myothervect2d[0][0];
    return 0;
}

К сожалению, это приводит к сбою компилятора и генерирует следующую ошибку

fatal error C1001: An internal error has occurred in the compiler.
1>  (compiler file 'msc1.cpp', line 1420)
1>   To work around this problem, try simplifying or changing the program near the locations listed above.
1>  Please choose the Technical Support command on the Visual C++ 
1>   Help menu, or open the Technical Support help file for more information

Фактически даже следующая основная функция вызываеттот же сбой и ошибка

int main()
{
    std::vector<std::vector<double> > mydoublevect2d;
    std::vector<std::vector<int> > myintvect2d;
    decltype(mydoublevect2d+myintvect2d) myothervect2d;
    return 0;
}

Код компилируется и работает нормально на gcc 4.6.1.Я попытался изменить оператор + на функцию с именем add, но это вызывает тот же сбой.Использование этой функции с 1d vecters работает нормально, поэтому она имеет отношение к рекурсии, т.е. это работает

int main()
{
    std::vector<double> mydoublevect;
    std::vector<int> myintvect;
    mydoublevect.push_back(1.0);
    myintvect.push_back(1);
    decltype(mydoublevect+myintvect) myothervect=mydoublevect+myintvect;
    return 0;
}

Кто-нибудь сталкивался с подобными проблемами и / или нашел решение?

Фил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...