我有一个抽象(模板化)类,我希望它有自己的返回类型 InferenceData
.
template <typename StateType>
class Model {
public:
struct InferenceData;
virtual InferenceData inference () = 0;
};
下面是从中派生的尝试
template <typename StateType>
class MonteCarlo : public Model<StateType> {
public:
// struct InferenceData {};
typename MonteCarlo::InferenceData inference () {
typename MonteCarlo::InferenceData x;
return x;
}
};
这有效,但只是因为 MonteCarlo::InferenceData
的定义被注释掉了。如果没有注释,我会收到无效协变返回类型错误。我想要每个ModelDerivation<StateType>::InferenceData
成为它自己的类型并拥有自己的结构实现。我如何实现这一目标?
最佳答案
您无法更改派生虚拟方法的返回类型。
这就是当您尝试从 MonteCarlo::inference()
返回派生的 InferenceData
时编译失败的原因。
为了实现您的需要,您需要使用多态返回类型,这需要指针/引用语义。
为此,您的派生 InferenceData
必须继承基 InferenceData
,并且 inference()
应返回指向基 的指针/引用推理数据
。
一种方法是使用智能指针 - 例如一个std::unique_ptr
- 请参阅下面的代码:
#include <memory>
template <typename StateType>
class Model {
public:
struct InferenceData {};
virtual std::unique_ptr<InferenceData> inference() = 0;
};
template <typename StateType>
class MonteCarlo : public Model<StateType> {
public:
struct InferenceDataSpecific : public Model<StateType>::InferenceData {};
virtual std::unique_ptr<Model::InferenceData> inference() {
return std::make_unique<InferenceDataSpecific>();
}
};
int main()
{
MonteCarlo<int> m;
auto d = m.inference();
return 0;
}
注意:如果需要共享数据,可以使用std::shared_ptr
.
关于c++ - 如何正确地从嵌套结构派生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72674420/