我刚刚从2008年升级到vc ++ 2010 express以便使用c ++ 11功能但我在递归重载运算符中使用尾随返回类型时遇到问题。我想采用具有任意数量维度的两个std :: vectors并添加元素以提供新的向量。但是我希望能够允许将int的向量添加到双精度等向量中并自动获得正确的返回类型 - 这需要尾随返回类型。这是重现错误的最小代码,并做了一些有用的事情。
#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上编译并运行正常。我尝试从operator +更改为名为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;
}
有没有人遇到类似的问题和/或找到解决方案?
菲尔