问题描述
在设计库的CRTP继承结构时遇到类型错误。我意识到以下事实可能会通过类型特征解决,但我什至不知道从哪里开始,并希望在这方面有一些指导。
粗略地说,Alg
和Geo
是两个从共享库继承的接口。 Alg
相当简单,但是Geo
稍微复杂一点,因为它将从Alg
派生的类作为模板参数。不完整的类型错误与该功能有关。 Minimal reproducible example
以下框架说明了当前的问题。
template <typename Derived>
struct FitCRTP {
Derived& derived() { return static_cast<Derived&>(*this); }
Derived const& derived() const { return static_cast<Derived const&>(*this); }
};
template <typename Derived>
class FitBase : public FitCRTP<Derived> {
friend class FitCRTP<Derived>;
protected:
FitBase() {}
explicit FitBase(const Matrix& data) {
this->derived().fit(data);
}
};
template <typename Derived>
class Alg : public FitBase<Derived> {
friend class FitBase<Derived>;
public:
void fit (const Matrix& data) {
this->derived().compute(data);
}
protected:
// constructors and misc functions ...
}
};
template <typename Derived,class A,class = std::enable_if_t<std::is_base_of_v<Alg<A>,A>>>
class Geo : public FitBase<Geo<Derived,A>> {
friend class FitBase<Geo<Derived,A>>;
public:
void fit (const Matrix& data) {
this->derived().compute(data,A(data).getGuess()); // <-- Problem line!
}
protected:
// constructors and misc functions ...
}
};
下面是A
派生类之一的示例和用法示例。
template <class A>
class SpathSVD : public Geo<SpathSVD<A>,A> {
friend class Geo<SpathSVD<A>,A>;
typedef Geo<SpathSVD<A>,A> Base;
public:
SpathSVD<A> : Base() {}
SpathSVD<A> (const Matrix& data) : Base(data) {}
protected:
SpathSVD& compute (const Matrix& data,Guess g) {
// Algorithm implementation ...
}
}
int main() {
SpathSVD<SomeAlgVariant> S;
S.fit(data);
}
发生错误是因为在compute
中找不到Geo<SpathSVD<SomeAlgVariant>,SomeAlgVariant>
函数。我该如何解决?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)