绕过自动生成的赋值运算符(VS 错误?
Getting around the auto-generated assignment operator (VS bug?)
采用以下代码:
class Foo
{
Foo const& operator =(Foo const& rhs); // disallow
};
struct Bar
{
public:
Foo foo;
template <class T>
T const& operator =(T const& rhs) { return rhs; }
};
struct Baz : public Bar {
using Bar::operator =;
};
int main()
{
Baz b1, b2;
b1 = b2;
}
这将无法编译,因为将使用 Bar::operator = 自动生成的赋值运算符,该运算符尝试使用 Foo::operator =,这是私有的。这没关系。所以我在 Bar 中添加了一个额外的成员:
Bar const& operator =(Bar const& b) { return Bar::operator=<Bar>(b); }
现在我们有一个不同的问题。我有两个重载,只能使用其中一个。我正在通过一个巴兹康斯特&。我对C++的了解表明,这最终应该使用非模板版本,因为首先选择匹配的非模板。这似乎也是gcc正在做的事情。Visual Studio似乎不同意:
error C2666: 'Bar::operator =' : 2 overloads have similar conversions
could be 'const Bar &Bar::operator =(const Bar &)'
or 'const T &Bar::operator =<Baz>(const T &)'
with
[
T=Baz
]
while trying to match the argument list '(Baz, Baz)'
我很想相信 gcc,这既是因为我对 C++ 的理解证实了这一点,也因为当 gcc 不同意 Visual Studio 时,我通常会站在 gcc 一边,但我并不像我那样关心这一点:
在我的非最小示例中,老实说,我根本不需要默认生成的赋值运算符。我会对模板操作员完成这项工作感到非常满意 - 它会正确地完成。但是,由于 VS 抱怨模板和自动生成的赋值运算符之间的冲突,我实际上根本无法让该模板工作。我已经尝试了以下所有方法:
- 使赋值运算符私有且未实现(不起作用,因为"并非所有重载都是可控的")
- 创建它(导致上述错误)
- 省略它(导致默认生成的赋值运算符出现上述错误)
- 为该类型创建模板的专用化,从而完全匹配默认赋值运算符(根据编译器明确非法)
有没有人对我如何解决这个问题有任何好主意?不幸的是,我的 VS 版本不支持自动生成的赋值运算符的 C++0x"删除"覆盖,因此这不是一个选项,我想不出任何其他方法来解决此错误。
两个版本的赋值运算符之间解析时看到的歧义是由 Baz 定义中的"using Bar::operator ="引起的。
无论是隐式的还是在 Bar 中显式定义的,非模板版本都采用参数 "const Bar&",它不完全匹配 "Baz",这是明确解析与模板的要求。
有很多方法可以解决这个问题,但真正的解决方案将取决于真正的来源。
为了修复这个例子,我会做这些事情:
o 防止自动生成const Bar& operator =(const Bar& b)
,因为它将使用 Foo 的赋值运算符。您已经尝试添加到 Bar 定义中的内容将起作用:
Bar const& operator =(Bar const& b) {
return Bar::operator=<Bar>(b);
}
o 巴兹的定义using Bar::operator =
需要去。将其替换为包装 Bar::operator= 的函数。 如:
template <class T>
const T& operator =(const T& rhs) {
return Bar::operator =(rhs);
}
(当然,非时髦的代码总是会返回 *this -- 一个 Bar&,而不是参数的类型。
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- 磁力计代码:C++ vs C - iosstream,矢量 - 错误iostream:没有这样的文件或目录
- VS 2017 社区收到链接器错误,但专业版没有
- 如何知道C2259 VS 2017错误未实现哪种方法?
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- IntelliSense在VS Code中使用Arduino时会引发 #include 错误
- 是 VS 代码 MinGW 与 Win32 中未定义的错误
- VS 2017 错误 C2664 地图插入尝试
- VS-2019 的编译错误
- MFC 对话框属性表用法在 VS 2017 中产生错误,适用于 VS 2013
- VS 2017 构建工具失败,出现错误 MSB4019:找不到导入的项目"D:Microsoft.Cpp.Default.props"
- 将参数传递给 c++ 构造函数时出现 VS 编译错误
- VS 错误 LNK2001:未解析的外部符号
- 无法将参数 1 从"VP"<T>转换为"VP<T> &",这是另一个 VS 错误
- 绕过自动生成的赋值运算符(VS 错误?
- 如何解决桨v0.8.0b上的"cudaSuccess = err (0 vs. 8)"错误?
- VS错误C2664(从函数返回字符串)c++