Tee*_*les 1 c++ stdarray c++17 stdoptional
我正在尝试填充 std::array 的 std::Optional 对象,如下所示。
\nclass MyClass\n{\n private:\n int distance;\n MyClass(int x, int y);\n\n friend class MasterClass;\n};\n\nMyClass::MyClass(int x, int y)\n{\n distance = x+y;\n}\n\nclass MasterClass\n{\n public:\n MasterClass(std::array<std::optional<int>,5> xs, std::array<std::optional<int>,5> ys);\n \n private:\n std::array<std::optional<MyClass>, 5> myclassarray{};\n\n};\n\nMasterClass::MasterClass(std::array<std::optional<int>,5> xs, std::array<std::optional<int>,5> ys)\n {\n for(int i=0; i<5;i++)\n {\n myclassarray[i].emplace(new MyClass(*xs[i], *ys[i])); //---(1)\n }\n\n }\nRun Code Online (Sandbox Code Playgroud)\n从上面用 (1) 注释的行中,我收到以下错误,
\nerror: no matching function for call to std::optional<MyClass>::emplace(MyClass&)\nRun Code Online (Sandbox Code Playgroud)\n我也尝试用以下内容替换同一行
\n myclassarray[i] = new MyClass(*xs[i], *ys[i]) ; //---(2)\nRun Code Online (Sandbox Code Playgroud)\n这会给我
\nerror: no match for \xe2\x80\x98operator=\xe2\x80\x99 (operand types are \xe2\x80\x98std::array<std::optional<MyClass>,5>::value_type\xe2\x80\x99 {aka \xe2\x80\x98std::optional<MyClass>\xe2\x80\x99} and \xe2\x80\x98MyClass*\xe2\x80\x99)\nRun Code Online (Sandbox Code Playgroud)\n我该如何解决这个问题?
\n看来您可能来自 Java 或 C#。在 C++ 中赋值时,很少会使用new. 问题是,你基本上是这样做的:
std::optional<MyClass> o = new MyClass();
Run Code Online (Sandbox Code Playgroud)
o 的类型为 ,std::optional<MyClass>并且new My Class()的类型为MyClass *。从这里可以看到,没有任何操作将对象的指针转换为对象的可选值。让我们回到基础,我们想做的是:
std::optional<int> o; // defaults to std::nullopt
o = value; // We set it with some value.
Run Code Online (Sandbox Code Playgroud)
实际上这就是全部内容了。所以让我们扩展到一个数组:
std::array<std::optional<int>, 5> a; // An array with 5 optional, all are std::nullopt
a[2] = value; // Set the optional at position 2 to a value.
Run Code Online (Sandbox Code Playgroud)
这很容易扩展到您的示例:
for(int i=0; i<5;i++) {
myclassarray[i] = MyClass(*xs[i], *ys[i]));
}
Run Code Online (Sandbox Code Playgroud)
请小心这一点:
*xs[i], *ys[i]
Run Code Online (Sandbox Code Playgroud)
因为从这里开始:
如果 *this 不包含值,则行为未定义。
如果是这种情况,这会给你带来很大的悲伤。
| 归档时间: |
|
| 查看次数: |
2082 次 |
| 最近记录: |