2010-05-07 2 views
34

Şablon oluşturucuyu açıkça başlatmayı (başlatıcı listesinde) nasıl anlatabilir misiniz? örneğin :C++ açık şablon yapıcısını çağırır

struct T { 
    template<class> T(); 
}; 

struct U { 
    U() : t<void>() {} //does not work 
    T t; 
}; 

sayesinde

Bu mümkün değil

cevap

35

. Standart ayrıca 14.8.1/7

bu bir not vardır [Not: açık şablon argümanı liste fonksiyonu şablon adını takip ettiklerinden ve dönüşüm üye işlev şablonları ve yapıcı üye işlev şablonları bir fonksiyon adı kullanmadan denir çünkü, Bu işlev şablonları için açık bir şablon argüman listesi sağlamanın bir yolu yoktur. onunla yaşayabilir]

, etrafta böyle identity Verilen

struct T { 
    template<class U> T(identity<U>); 
}; 

struct U { 
    U() : t(identity<void>()) {} 
    T t; 
}; 

bunu çalışabilir

template<typename T> struct identity { typedef T type; }; 
+0

thank you.no Çok önemli bir şey, ben bu çalışabilirsiniz boost tanımlanan oluyor – Anycorn

+13

@litb: Açıkça T: T ()? –

+0

@JosephGarvin 'T() 'nin, parantezden önce birşeye sahip olmasıyla çalıştığından şüpheleniyorum,' Type()' geçici bir nesne oluşturur. Bu, parens öncesi bir işlevin olduğu T :: T () 'ile uyumsuzdur. Bunun anlamı adlandırılmış işlevi çağırmaktır. Ama doğrudan bir kurucu çağırmak hiçbir anlam ifade etmiyor, en azından çalışmasını ve beklenen şeyi yapmasını sağlamak için ek bir yazı gerektiriyor. –