2011-02-09 23 views
13

Aşağıdaki kod Xcode bir derleme hatası oluşturur:Örtülü Şablon parametreler

template <typename T> 
struct Foo 
{ 
    Foo(T Value) 
    { 
    } 
}; 

int main() 
{ 
    Foo MyFoo(123); 
    return 0; 
} 

error: missing template arguments before 'MyFoo'

Foo MyFoo(123);Foo<int> MyFoo(123); düzeltmeleri sorunu değiştirilmesi değil, derleyici uygun anlamaya gerekir veri tipi?

Bu bir derleyici hatası mıdır, yoksa örtülü şablon parametrelerini yanlış anlıyor muyum?

Foo MyFoo(123); 

MyFoo geçici alanı ayrılıyor mı ve bilmesi bakımından MyFoo tam nitelikli tipini bilmelisiniz:

cevap

11

yapıcı teoride o inşa ediyor nesnenin türünü, ancak ifadeyi anlaması olabilir ne kadar alan gerekiyor.

bir özellikle karmaşık şablonun adını (parmaklarla yani) yazarak önlemek istiyorsanız, bir typedef kullanmayı düşünün: olması

typedef std::map<int, std::string> StringMap; 

Veya C++ 0x ile

Eğer auto anahtar kelime kullanabilirsiniz derleyici kullanımı türü çıkarsama - birçoğu kendileri arasında kendimi daha az okunabilir ve daha fazla hata eğilimli kod yol açar. ; P

+5

, bu boşluk anlaması başladı. –

+6

Arayanın türünü yapıcıya çağırır, ancak depolama alanı için değil. Bir değişkeni basitçe 'Foo' olarak tanımlarsanız, her ikisi de Foo 've' Foo 'tutabilir mi? Ya da her zaman kalbinin kalbinde gizlice bir 'Foo ' olduğunu biliyor mu? Eğer değişken “const” ise, bu değer uygulanabilir, çünkü bu değer yeniden atanamazdı, ancak daha sonra “T” ve “T” için farklı sözcük kurallarına sahip olurduk ve büyük bir tahribat gerçekleşecekti. –

7

derleyici değil sınıfları/yapılar

+3

Sonuçta, std :: pair 'a sahip olsak bile, std :: make_pair (T t, U u) 'fonksiyonunun bir nedeni vardır. '. –

2

Bu bir böcek değil için, sadece templated fonksiyonlar için şablon parametre türü çözebiliriz o var olmayan bir özelliktir. Örnekleme sırasında sınıf/yapı şablonu argümanlarını tam olarak belirtmeniz gerekir, her zaman, işlev şablonları için olabileceğinden türler çıkarılmaz.

2

Derleyici şablon argümanı böyle durumda çıkarabiliriz:

template<typename T> 
void fun(T param) 
{ 
    //code... 
} 

fun(100); //T is deduced as int; 
fun(100.0); //T is deduced as double 
fun(100.0f); //T is deduced as float 

Foo<int> foo(100); 
fun(foo); //T is deduced as Foo<int>; 

Foo<char> bar('A'); 
fun(bar); //T is deduced as Foo<char>; 

Aslında şablon argümanı kesinti büyük bir konudur. ACCU bu makaleyi okuyun: Foo T türüdür nerede, sadece Foo<T> bir sınıftır olarak

The C++ Template Argument Deduction

0

O, böyle bir anlamda bir çok yapar.

C++ 0x'de otomatik kullanabilirsiniz ve size bir Foo yapmak için bir işlev oluşturabilirsin, buna foo diyelim (küçük harf f). Sonra C++ 11 yılında

template<typename T> Foo<T> foo(int x) 
{ 
    return Foo<T>(x); 
} 

auto myFoo = foo(55); 
+0

Belki de kastettiniz: "template Foo foo (T x)"? –

2

yapardın decltype kullanabilirsiniz: o türünü tahmin eğer

int myint = 123; 
Foo<decltype(myint)> MyFoo(myint);