2016-11-28 134 views
2

我试图做一个程序,它在结构上与此类似:如何在一个层次结构类中使用std :: is_base_of?

#include <type_traits> 

template <class A, class B, class C = void> 
class Test {}; 

template <class A, class B> 
class Test<A *, B *, typename std::enable_if<std::is_base_of<A, B>::value>::type> { 
public: 
    int a; 
}; 

class X {}; 

class Y : public X { 
private: 
    using T = Test<X *, Y *>; 
    T t; 
public: 
    Y() : t() {t.a = 1;} 
}; 

也就是说,我想有同时使用基地和派生类:导出类中的模板实例,并确保有是两个类之间的派生关系。

但是这不能在gcc 6.1.0下编译。错误信息是:

error: invalid use of incomplete type 'class Y' 

那么我该怎么做才能使这段代码有效?谢谢!

+0

我相信明确指出'std :: is_base_of'的第二个参数必须是完整类型, [here](http://en.cppreference.com/w/cpp/types/is_base_of) –

+0

但是你可以像你一样[适当的测试] [http://melpon.org/wandbox/permlink/ XtyrECZMSLVVywKl)...(我在这里使用[Yakk的代码](http://stackoverflow.com/a/40764548/4324224)从一个不同的问题/答案) –

回答

0

这是因为当你指定一个类型作为非指针/非引用对象时,需要你事先定义类型的(存储)。如果您使用T作为指针它应该工作这样:

class Y : public X { 
private: 
    using T = Test<X *, Y *>; 
    T* t; 
public: 
    Y() : t(new T) {t->a = 1;} 
}; 

这当然有其自身的一些缺点。

+0

谢谢!这工作。 – user1978373