1

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

我已经阅读了C++ 模板运算符重载不同类型,但这并不是我想要做的。

我有这样的课:

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

    typedef T type;
    T value;
}

现在我尝试添加一些返回类型的运算符 ( =, +, -, *, /, %) 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;};

最终代码:

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

    typedef T type;
    T value;

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

1 回答 1

4

第一个问题

没有这样的事情std::decltypedecltype是一个关键字。其次,在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 +它被定义为(可能是朋友)自由函数,而不是成员函数,因此即使您的类型的对象没有作为第一个操作数传递,您也可以实际使其工作。

于 2013-05-24T13:55:24.563 回答