访问不完整类型的成员类型

时间:2016-03-10 05:27:20

标签: c++ templates crtp

要编译它的解决方法是什么?

#include <iostream>

template <typename Derived>
struct CRTP {
    void foo (const typename Derived::type& a) {std::cout << a << '\n';}
};

struct A : CRTP<A> {
    using type = int;
};

struct B : CRTP<B> {
    using type = std::string;
};

// etc...

int main() {
    A a;
    a.foo(5);
}

这将无法编译,因为在CRTP<A>实例化时,A还不是一个完整的类,因此无法访问A::type。但是解决方法是什么?我需要这种类型的设计,以便foo函数可以一般用于许多不同的类。

2 个答案:

答案 0 :(得分:2)

我很确定你不能在'使用'的情况下使用CRTP。您可以将它用于方法和成员,但不能用于类型之类的东西。虽然使用模板时,将类型作为模板参数是有用的,所以为什么不这样做

template <typename Derived, typename Type>
....

这将完美无缺。

答案 1 :(得分:2)

有点疯狂的选择是推迟评估,直到尝试调用foo,此时Derived将完成。这需要将其作为模板。

template <typename Derived>
struct CRTP {
    template<class T = Derived>
    void foo (const typename T::type& a) {std::cout << a << '\n';}
};

如果需要,可以通过foo阻止使用非Derived类型的static_assert来调用。