多层CRTP中“未命名成员”的不完整类型

问题描述

在设计库的CRTP继承结构时遇到类型错误。我意识到以下事实可能会通过类型特征解决,但我什至不知道从哪里开始,并希望在这方面有一些指导。

粗略地说,AlgGeo是两个从共享库继承的接口。 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...