考慮下面的代碼:別名模板,局部特殊化和無效參數類型爲void
template<typename F>
struct S;
template<typename Ret, typename... Args>
struct S<Ret(Args...)> { };
template<typename... Args>
using Alias = S<void(Args...)>;
int main() {
S<void(int)> s;
Alias<int> alias;
}
它正常工作,如預期,既涉及S
和一個涉及Alias
引擎蓋同一類型下定義線S<void(int)>
。
現在,考慮以下變化:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
我希望它來編譯,對於類似於上面提到的那些原因。
不言而喻,它並沒有因爲涉及Alias
行的編譯,而不是我的錯誤:
In substitution of 'template using Alias = S [with Args = {void}]'
[...]
error: invalid parameter type 'void'
的問題很簡單:我錯過了這裏?
解決方法很明顯,但是出於同樣的原因它不應該編譯這兩行嗎? 'S'導致一個推論,試圖(好,成功)*創建一個函數類型,其中參數的類型爲'void' *。我錯了嗎? –
skypjack
@skypjack剛剛找到我正在尋找的部分。 'void'必須是非依賴的。 – Barry
感謝您的參考。無論如何,也不是'template'中的'Args'類型名稱Ret,typename ... Args> struct S {};'應該遭受同樣問題的依賴類型? –
skypjack