2014-10-24 21 views
5

Ben benzeyen bir sınıf var için bir arzusu var:Sınıf bir argüman olmadan bir şablon oluşturucuya sahip olabilir mi?

template <typename T> 
class foo 
{ 
    public: 
    template <typename S> 
    foo() 
    { 
     //... 
    } 
}; 

ama kurucusunu çağırmak anlamaya olamaz. Açıkçası, bu çalışmayı foo() S türünde bir argüman vererek yapabilirim, ancak herhangi bir argüman olmadan yapılabilir mi?

--Ron

+1

http://stackoverflow.com/questions/26553803/derive-from-template-constuctor-of-template-base-class – 0x499602D2

cevap

3

Bir yapıcı şablonuna açıkça şablon argümanları geçemez. Kurucuların isimleri yok.

[Not: açık şablon bağımsız değişken listesi işlev şablonu adını izler ve dönüşüm üye işlevi şablonları ve yapıcı üye işlev şablonları bir işlev adını kullanarak olmadan denir, çünkü yolu yoktur Çünkü Bu işlev şablonları için açık bir şablon argüman listesi sağlar. - uç not] sözdizimi foo<int>::foo kullanarak bir kurucu isim de, sadece burada herhangi bir ilgi olmayan yöntemlerle kullanılabilecek

:

bir arama olarak hangi yapıcı kabul edilebilir bir arama sonucu ve bir iç içe isim belirteci bir sınıf C aday:
- adı iç içe isim şartname sonra belirtilmişse, [...]
adı yerine sınıf C yapıcısı isim olarak - C içine baktığında, C (Madde 9) ya da
arasında enjekte sınıf-adıdır. [...] Böyle bir yapıcı adı o isimleri yapıcı ya da kullanılarak-beyanında bir bildirinin Bildiricisi-id sadece kullanılacaktır. gcc 4.4.5 üzerinde benim için çalışıyor

+0

"Yapıcı şablonuna beş şablon argümanını atamazsınız": False. Bir çift yineleyici ile başlatılabilen vektörün yapıcısını görün. Bkz. (4) http://en.cppreference.com/w/cpp/container/vector/vector – Notinlist

+2

Şablon argümanlarını ** açık bir ** bir kurucu şablonuna geçiremezsiniz. Yapıcılar templat edilebilir, ancak tüm şablon argümanları çıkarılmalıdır. –

+0

@BenVoigt Cevabımı gör. – Notinlist

1

(Debian 4.4.5-3) g++ -W -Wall -Wextra -pedantic tc.cpp -o tc, herhangi bir uyarı olmadan Derleyen

template<typename T> 
class A 
{ 
public: 
    template<typename U> 
    A() 
     : t(U()) 
    { } 
private: 
    T t; 
}; 

int main() 
{ 
    using namespace std; 
    A<float> a(A<float>::A<int>()); 
    return 0; 
} 

.

UPDATE: Bu çözüm yanlış. Yorumlarda açıklanmıştır. Bunu faydalı bir kötü çözüm olarak görüyorum ve burada tutmak istiyorum. Lütfen reddetme, çünkü onu kaldırmam gerekecek. Umarım bu işe yarar. Şerefe!

+1

Aslında yaptığınız şey [derlememeliydiniz] (http://ideone.com/AJ90Rz) ... buggy g ++ gibi görünüyor. – cdhowie

+2

Lol. 'A :: A ', A 'ile eşdeğerdir. Std :: is_same' ile kontrol edin. ;) – Columbo

+0

Açık argüman listesi şablonun adını izler, ancak ** "Yapıcıların adları yoktur." **. –

İlgili konular