Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符的声明-具有两种不同类型的对象_C++_C++11 - Fatal编程技术网

C++ 重载运算符的声明-具有两种不同类型的对象

C++ 重载运算符的声明-具有两种不同类型的对象,c++,c++11,C++,C++11,我有一个模板类,并编写了一个操作符-它应该对两个不同类型的对象进行计算,并将其作为新对象返回。现在我想知道如何在我的类中声明这个操作符,因为 template<typename S> friend auto operator-(const XY<T>,const XY<S>)->XY<decltype(T-S)>; 模板 友元自动运算符-(常数XY,常数XY)->XY; 不允许吗? 下面是我的示例代码: template <ty

我有一个模板类,并编写了一个操作符-它应该对两个不同类型的对象进行计算,并将其作为新对象返回。现在我想知道如何在我的类中声明这个操作符,因为

template<typename S> 
friend auto operator-(const XY<T>,const XY<S>)->XY<decltype(T-S)>; 
模板
友元自动运算符-(常数XY,常数XY)->XY;
不允许吗? 下面是我的示例代码:

template <typename T>
class XY{
private:
    T x

...

// template<typename S> 
// friend auto operator-(const XY<T>, const XY<S>)->XY<decltype(T-S)>;

};

template <typename T, typename S>
auto operator-(const XY<T> z1, const XY<S> z2)->XY<decltype(z1.x - z2.x)>{
    decltype(z1.x - z2.x) x;
    x = (z1.x - z2.x);
    XY<decltype(x)> n(x);

    return n;
}
模板
XY类{
私人:
T x
...
//模板
//友元自动运算符-(常数XY,常数XY)->XY;
};
模板
自动运算符-(常数XY z1,常数XY z2)->XY{
decltype(z1.x-z2.x)x;
x=(z1.x-z2.x);
xyn(x);
返回n;
}

这就是你要找的吗

template <typename T>
class XY{
private:
    T x;

template <typename U, typename S>
friend auto operator-(const XY<U> z1, const XY<S> z2)->XY<decltype(z1.x - z2.x)>;

};

template <typename T, typename S>
auto operator-(const XY<T> z1, const XY<S> z2)->XY<decltype(z1.x - z2.x)>{...}
模板
XY类{
私人:
tx;
模板
friend自动运算符-(常数XY z1,常数XY z2)->XY;
};
模板
自动运算符-(常数XY z1,常数XY z2)->XY{…}

这就是你要找的吗

template <typename T>
class XY{
private:
    T x;

template <typename U, typename S>
friend auto operator-(const XY<U> z1, const XY<S> z2)->XY<decltype(z1.x - z2.x)>;

};

template <typename T, typename S>
auto operator-(const XY<T> z1, const XY<S> z2)->XY<decltype(z1.x - z2.x)>{...}
模板
XY类{
私人:
tx;
模板
friend自动运算符-(常数XY z1,常数XY z2)->XY;
};
模板
自动运算符-(常数XY z1,常数XY z2)->XY{…}


复合
->Complex
->XY
的目的是什么?除非这是我不知道的新语法功能,否则这是无效的。@Litty它被称为尾随返回类型。添加它是为了让我们可以使用模板类型来确定返回值。你每天都会学到一些新东西。为什么你的第一次申报不被允许?利蒂只是我的一个错误。忘记将其更改为示例代码的样式。编辑it@Littydecltype需要一个表达式,而不是不同数据类型的连接(所以我不能说decltype(double int))
->Complex
->XY
的目的是什么?除非这是我不知道的新语法功能,否则这是无效的。@Litty它被称为尾随返回类型。添加它是为了让我们可以使用模板类型来确定返回值。你每天都会学到一些新东西。为什么你的第一次申报不被允许?利蒂只是我的一个错误。忘记将其更改为示例代码的样式。编辑it@Littydecltype需要一个表达式,而不是不同数据类型的连接(所以我不能说decltype(double int))是的,这正是我想要的。我有一个非常类似的版本,但我使用了替代模板:模板或只是模板。你能解释一下,为什么我需要另一个模板参数而不是我已经存在的T?因为你希望你的
操作符-
是一个有两个模板参数的函数模板,不是吗?是的,但我的问题更多的是为什么我需要U和S而不是T和S。为什么我不能在这里使用我的T?如果你尝试,你会得到一个错误。例如,在叮当声中:“声明'T'阴影模板参数”。有一个语法规则,本质上说,模板参数的名称不应该被重用到其他地方。不知道为什么;我想这会让语法变得模棱两可。无论如何,这是一个避免混淆的好建议。是的,这正是我想要的。我有一个非常类似的版本,但我使用了替代模板:模板或只是模板。你能解释一下,为什么我需要另一个模板参数而不是我已经存在的T?因为你希望你的
操作符-
是一个有两个模板参数的函数模板,不是吗?是的,但我的问题更多的是为什么我需要U和S而不是T和S。为什么我不能在这里使用我的T?如果你尝试,你会得到一个错误。例如,在叮当声中:“声明'T'阴影模板参数”。有一个语法规则,本质上说,模板参数的名称不应该被重用到其他地方。不知道为什么;我想这会让语法变得模棱两可。这是一个很好的建议,以避免混淆,在任何情况下。