Я только что обновился до 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;
}
Кто-нибудь сталкивался с подобными проблемами и / или нашел решение?
Фил