C ++模板运算符重载不同类型,自动返回类型

时间:2013-05-24 13:51:21

标签: c++ templates c++11

我正在尝试使用auto返回类型(C ++ 11)

进行重载

我已经阅读了C++ template operator overloading with different types,但这并不是我想要做的。

我有一个这样的课程:

template<typename T>
class Attr
{
    public:
    Attr(const T& v) : value(v) {};

    typedef T type;
    T value;
}

现在我尝试添加一些运算符(=+-*/%)和{{ 1}}返回类型,所以我在auto内添加了这段代码:

Attr

我尝试将template<typename U> T& operator=(const U& v){value=v;return value;}; //work template<typename U> auto operator+(const U& v) -> std::decltype(Attr<T>::type+v) const //line 29 { return value+v; }; //fail 替换为:

  • std::decltype(Attr<T>::type+v)
  • std::decltype(value+v)
  • std::decltype(Attr<T>::value+v)

我也尝试删除std::decltype(T()+v),但没有变化,我总是有这些错误:

const

编辑: 首先,ORM/Attr.hpp:29:47: erreur: expected type-specifier ORM/Attr.hpp:29:47: erreur: expected initializer 不是decltype的成员。

应该是:

std

最终代码:

template<typename U> auto operator+(const U& v)const -> decltype(value+v) {return value-v;};

1 个答案:

答案 0 :(得分:4)

第一个问题

没有std::decltype之类的东西。 decltype是关键字。其次,在decltype表达式中,您尝试添加对象和类型。虽然我理解你的意图,对于编译器来说,这是无意义的。

您可以将std::declval<>用于此目的:

template<typename U>
auto operator+(const U& v) ->
    decltype(std::declval<T>()+v) const //line 29
{
    return value+v;
};

或者,如果您在之前已将value数据成员声明为您在成员函数正文之外引用它的位置,则可以执行以下操作:

template<typename U>
auto operator+(const U& v) ->
    decltype(value + v) const
//           ^^^^^
//           Valid only if the "value" data member has been declared before
{
    return value+v;
};

第二个问题

通常,operator +被定义为(可能是朋友)自由函数,而不是成员函数,因此即使您的类型的对象未作为第一个操作数传递,您也可以实际使其工作