下面的代碼編譯工作,但將無法正常工作:C++模板特不嵌套類型
template<typename T>
struct Nesting
{
template<typename U>
struct _Nested
{
};
template<typename U>
using Nested = _Nested<U>;
};
template<typename T>
struct F
{
static constexpr bool is_my_nested_class = false;
};
template<typename T, typename U>
struct F<typename Nesting<T>::Nested<U>>
{
static constexpr bool is_my_nested_class = true;
};
我創建這些嵌套和嵌套類型,並嘗試在其上使用類型特徵的圖案。它編譯(使用MSVC2014瓦特/ CPP11),但
F<Nesting<int>::Nested<long>>::is_my_nested_class
回報假。
這是標準禁止或未定義的嗎?它打破了什麼規則?任何解決方法?
非常感謝!
我相當確信結構F中的T'嵌套嵌套 ::嵌套>處於不可僞裝的上下文中,因爲這樣的編譯器在傳入類型時無法建立'T'和'U'模板實例化 –
'struct F ::嵌套>'我應該認爲'struct F :: template嵌套>'。然後,叮噹聲4.0給出:'錯誤:類模板部分特化包含無法推斷的模板參數;這部分專業化將永遠不會被使用' –
davmac
感謝您的幫助,我修改了F,以便給出參數T而不是被推導出來(不能)。沒有類型別名,它告訴我U不能被推斷出來。如果我將兩個參數都提供給F(不是推導出來的),它可以正常工作。非常感謝你,我想我明白了這個問題:)我也覺得有趣的事實是,如果嵌套是非模板類型,那麼推導出U.可能有一些基本概念我還沒有把握,在這裏! – Michel