2009-04-28 38 views
27

Bazen bazen değil çalışır: Yukarıdaki örnekte etrafında kesmek için bir yolBir derleyici bir şablon parametresi çıktığında?

template <class T> 
void f(T t) {} 

template <class T> 
class MyClass { 
public: 
    MyClass(T t) {} 
}; 

void test() { 
    f<int>(5); 
    MyClass<int> mc(5); 
    f(5); 
    MyClass mc(5); // this doesn't work 
} 

var mı? Yani Derleyici, şablon parametresini yapıcı parametresiyle karşılaştırmaya zorlar.

Gelecekte bu düzeltilecek mi, yoksa iyi bir neden mi var?

Derleyici şablon parametresini önerdiğinde genel kural nedir?

cevap

47

Şablon parametreleri parametre tipi şablondan anlaşılabilmektedir zaman fonksiyon şablonları bilgilerin tahmin parametreleri edilebilir

Yani

burada çıkarılabilir: burada

template <typename T> 
void f(T t); 

template <typename T> 
void f(std::vector<T> v); 

ama:

Ve sınıfı şablonlarda değil.

template <class T> 
    class MyClass { 
    public: 
     MyClass(T t) {} 
     void print(){ 
      std::cout<<"try MyClass"<<std::endl; 
     } 
    }; 

    template <typename T> 
    MyClass<T> MakeMyClass(T t) { return MyClass<T>(t); } 

ve ardından sınıf örneğini oluşturmak için auto a = MakeMyClass(5); çağırır:

Yani sorunun olağan çözümü standart kütüphane fonksiyonu std::make_pair benzer bir sarmalayıcı işlevini yaratmaktır.

+0

+1, kapsamlı. Minor nit: "Parametre tipi bağımlı olduğunda" "bir parametre tipi bağımlı olduğunda" değiştirmeyi öneririm. –

+2

void f (typename T :: const_iterator t); << burada, T indirgenemez bir bağlamda görünür. Bir vektör :: const_iterator ile çağrılırken bile, örneğin, T için vektörü çıkartamayacaktır, bunun nedeni :: const_iterator öğesinin T'ye bağlı olması, ancak T'nin yeniden anlamı :: const_iterator. bu yüzden boost :: implicit_cast şöyle kodlanır: template T implicit_cast (typename identity :: type t) {return t; } yine burada, düşünülemez bir bağlam var. –

+0

Standart-ref 14.8.2.4/4'tür (en son C++ 1x taslağı 14.9.2.5/5'te yer alır - mevcut standarttaki ifadelerin eksikliklerini de giderir). :) alkış –

İlgili konular