簡體   English   中英

作為模板實例的基類的初始化不需要模板參數?

[英]No template argument needed for initialization of base class which is a template instance?

我有一個從特定模板實例派生的非模板類。 像往常一樣,基類必須在派生類的構造函數中初始化。 我發現在調用構造函數時可以省略特定的模板參數:主要編譯器(VC、g++、clang)接受它。 這看起來很奇怪,因為類模板本身不是類名:

$ cat template-base.cpp && g++ --pedantic -o template-base template-base.cpp  && ./template-base
template <int I>
struct T
{
        T(int) {}
};

struct DT: public T<1>
{
        // Note: T<1>(42) is possible but not necessary.
        // T<2>(42) is an error ("T<2> is not a base class", which is correct).
        DT(): T(42) {}
};

int main()
{
        DT dt;
}

(Johannes Schaub 回答了這個類似的問題,其中派生類本身也是一個模板。在這種情況下,模板參數是強制性的,即使它在那里同樣可以推導出。)

為什么我可以在這里使用像類名這樣的模板名稱? T不是一類!

這與 注入的類名有關 當類模板用作基類時,該語言允許您使用模板的名稱,就像您指定參數一樣,因為它知道這些參數是什么。 正在做

DT(): T(42) {}

擴展到

DT(): T<1>(42) {}

由編譯器為您提供。


允許這樣做的標准語言可以在[temp.local] 中找到

暫無
暫無

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

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