2011-12-21 108 views
1

這是我一直在尋找的代碼,Source code混淆繼承和模板

template <typename T> 
struct function_traits 
    : public function_traits<decltype(&T::operator())> 
{}; 

如果我們有一些仿Xfunction_traits<X>;實例化,這將築基類,這是function_traits<decltype(&X::operator())>因繼承,但建立function_traits<decltype(&X::operator())>它的基地也必須建立,這可能是function_traits<decltype(Z)>

據我所知function_traits<X>!= function_traits<Z>。這不是遞歸繼承嗎? 0_o。 所有事情如何一起工作?

+0

當你嘗試時會發生什麼? – 2011-12-21 21:11:53

+0

我不明白你的問題是什麼。這不是沒有'function_traits'的成員函數指針的其他專門化的有效代碼。 – ildjarn 2011-12-21 21:15:38

+0

@FreakEnum:是的,該代碼包含我所指的確切的專業化。 ; - ] – ildjarn 2011-12-21 21:28:45

回答

2

這是非法的代碼。你不能從一個不完整的類型派生出來,並且在你嘗試從function_traits得出的點上,類型是不完整的。

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

X<B> test; // error: invalid use of incomplete type ‘struct X<A>’ 

你可以避開這個問題的唯一方法是,如果function_traits你正試圖從推導是一個完整的類型。爲此,您可以使用專業化:

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

template <> 
struct X<A> {}; // X<A> is now a complete type. 

X<B> test; // OK! Derives from X<A>, which is complete. 

這裏,X<A>完畢後,您試圖從中得到,所以你的罰款。

+0

這裏是整體如果你可能想看看http://github.com/kennytm/utils/blob/master/traits.hpp – 2011-12-21 21:25:55

+1

@FreakEnum:正如你所看到的,他專門爲第一個下面的各種類型的功能模板定義,所以他總是有一個完整的課堂。我相信KennyTM會回答你有任何其他問題:-) http://stackoverflow.com/users/224671/kennytm – 2011-12-21 21:32:14

+0

現在,這對我來說是有道理的。謝謝:) – 2011-12-22 09:14:59