无法专门化函数模板编译器错误

时间:2015-01-27 16:43:39

标签: c++ templates visual-studio-2012 c++11

我有一个模板向量类,我试图重载算术运算符,这样加入/减去不同基元类型的向量将产生算术运算返回的基本类型的向量(即,添加一个int向量)并且double的向量将产生double的向量。相关代码如下:

template<typename T>
class Vector {
private:
T x, y, z;

public:
   // constructors, destructors, etc.

   T X() const { return ( this->x ); }
   T Y() const { return ( this->y ); }
   T Z() const { return ( this->z ); }

   template<typename U> auto operator+(const Vector<U> &v) const -> Vector<decltype(this->x + v.X())>
   {
       return ( Vector<decltype(this->x + v.X())>( this->x + v.X(), this->y + v.Y(), this->z + v.Z() ) );
   }
};

然后,在main.cpp中:

Vector<double> d1(1,2,3), d2(4,5,6);
std::cout << d1 + d2;

我从Visual Studio 2012中收到以下错误:

error C2893: Failed to specialize function template 'Vector<T> Vector<double>::operator +(const Vector<U> &) const'

with
[
T=unknown
]

With the following template arguments:

'double'

error C2676: binary '+' : 'Vector<T>' does not define this operator or a conversion to a type acceptable to the predefined operator

with
[
T=double
]

请告知。

1 个答案:

答案 0 :(得分:1)

Visual C ++无法确定decltype表达式的正确类型。通过将您的表达式替换为decltype(*((T*)0) + *((U*)0)),您可以删除对this和参数v的依赖关系,从而导致VS上的预期结果。

注意:在VS2013.4上也可以重现Bug,并且还测试了修复程序。