Aşağıdaki kod göz geçersizleĢeceği parametre türü: Bu, iyi çalışırad şablonu, kısmi uzmanlık ve
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;
}
ve beklendiği gibi S
ve Alias
başlık aynı tip altında tanımlar içeren bir ilgili hattı hem de S<void(int)>
.
Şimdi, aşağıdaki değişiklikleri göz önünde bulundurun:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
Ben yukarıda sayılanlar benzer nedenlerle, bu derlemeye bekleniyor.
In substitution of 'template using Alias = S [with Args = {void}]'
[...]
error: invalid parameter type 'void'
soru oldukça basittir: O, bunun nedeni Alias
karıştığı hattının derleme değil söylemeye gerek yok
yerine hatası alıyorum burada ne cevapsız? vurgu mayın, [dcl.fct] Gönderen
Bu geçici çözüm açıktır, ancak her iki satırı da aynı nedenle derlemek başarısız mıdır? Ayrıca, "", bir parametrenin bir "void" * tipine sahip olduğu bir işlev türü oluşturmak için (iyi, başarılı) deneyen bir kesintiye yol açar. Yanlış mıyım? –
skypjack
@skypjack Aradığım bölümü buldum. 'Boş' bağımlı değildir. – Barry
Referans için teşekkür ederiz. Her neyse, ayrıca '' Args'''de de 'typename Ret', typename ... Args> struct S {}; 'aynı sorundan muzdarip bağımlı bir tür? –
skypjack