[英]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.