2016-11-28 109 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