簡體   English   中英

嵌套類中的別名模板

[英]aliased templates in nested classes

我正在嘗試從C的實例開始獲取T2<B>的模板別名。

template<typename A>
struct T1
{
   template<typename B>
   struct T2{};
};

template<typename A>
class C
{
   T1<A> t;
};

template<typename A>
using U1=decltype(C<A>::t);

template<typename A, typename B>
using U2=typename U1<A>::T2<B>;

我在gcc 4.8中遇到編譯器故障:

gg.cc:18:28: error: expected ‘;’ before ‘<’ token
 using U2=typename U1<A>::T2<B>;

我在每個明智的位置都使用typename關鍵字,但是無法編譯U2定義。

正確的語法是什么? 如果我不求助於U1而得到U2的定義,那就更好了。

您需要使用template消歧器來告訴編譯器將T2解析為模板的名稱(以及隨后的<>作為相應模板參數的定界符):

    template<typename A, typename B>
    using U2=typename U1<A>::template T2<B>;
//                           ^^^^^^^^

這是一個正在編譯的實時示例

在這里,您可以找到有關何時應該使用template消歧器(以及typename消歧器)的更多信息,盡管您似乎已經意識到了這一點。

編譯器編譯以下內容時:

template<typename A, typename B>
using U2=typename U1<A>::T2<B>;

在讀取嵌套名稱說明符U1<A>::之后,由於A是未知的,所以它不知道它在U1哪個專業領域中。 每個U1專業化可能完全不同,並且取決於A是什么。 因此,不知道T1是什么樣的名稱。 特別是它不知道它是否是模板名稱。 (例如, U1<int>::T1可能與U1<char>::T1完全不同。)

因此,您需要通過在T1之前使用template關鍵字來明確告知編譯器T1將是模板名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM