C++

2010-03-15 11 views
47

'daki şablon değişkenleri ile yapıyorum Şablonlarla etrafta dolaşıyorum. Ben std :: vector icat etmeye çalışmıyorum, C++ 'da templateting bir kavrayış almaya çalışıyorum.C++

Aşağıdakileri yapabilir miyim?

template <typename T> 
typedef struct{ 
    size_t x; 
    T *ary; 
}array; 

Ne yapmaya çalışıyorum olduğunu temel bir şablonu sürümü:

typedef struct{ 
    size_t x; 
    int *ary; 
}iArray; 
yerine yapı sınıfını kullanırsanız işe yarıyor gibi görünüyor

, bu nedenle typedef yapılar ile mümkün değildir ?

cevap

106

Sorun, typedef'in şablonunu çizememenizdir, ayrıca C + + 'da yapıları yazmanıza gerek yoktur.

şu sen

template <typename T> 
struct array { 
    size_t x; 
    T *ary; 
}; 
+3

+1 kodunuz ile @ monkeyking'in arasındaki farkı açıklıyor. – rcollyer

18
template <typename T> 
struct array { 
    size_t x; 
    T *ary; 
}; 
8

Sen sınıflar ve yapılar için açık bir typedef yapmak gerekmez. typedef için ne gerekiyor? Ayrıca, template<...>'dan sonra typedef sözdizimsel olarak yanlıştır. Sadece şunu kullanın:

template <class T> 
struct array { 
    size_t x; 
    T *ary; 
} ; 
+0

Yapı adı nereye gitti? :) – GManNickG

+0

@GMan: Güncellendi. – dirkgently

+0

Hm, bunu yaptıktan sonra koymak mı istediniz? – GManNickG

5

Sen bir yapı hem de bir sınıf şablon olabilir gerekenleri yapacağız. Ancak yazım hatası yapamazsınız. Yani template<typename T> struct array {...}; çalışır, ancak template<typename T> typedef struct {...} array; yapmaz. C++ 'da typedef trick'e gerek olmadığını unutmayın (C++' da struct değiştiricisi olmayan yapıları kullanabilirsiniz).

4

The Standard (14/3 de. Standart dışı millet, bir sınıf tanımı gövde (ya da genel olarak bir bildiriminde türü), aşağıdaki isimler "declarators" olan) şeklinde bir de

Şablon beyannamesi, açık uzmanlık veya açık bir ifadeyle dec-laration'da init-declarator-list en çok bir deklare ediciyi içerecektir. Bir sınıf şablonunu bildirmek için böyle bir beyan kullanıldığında, deklarasyona izin verilmez.

Andrey şovları gibi yapın.

3

Sözdizimi yanlış. typedef kaldırılmalıdır.

3

Diğer yanıtlardan sorun, yazdığınız bir yazım hatası oluşturuyor olmanızdır. Bunu yapmanın tek "yolu" templated bir sınıf kullanmaktır; Örneğin, temel şablon meta programlaması.

template<class T> class vector_Typedefs { 
    /*typedef*/ struct array { //The typedef isn't necessary 
     size_t x; 
     T *ary; 
    }; 

    //Any other templated typedefs you need. Think of the templated class like something 
    // between a function and namespace. 
} 

//An advantage is: 
template<> class vector_Typedefs<bool> 
{ 
    struct array { 
     //Special behavior for the binary array 
    } 
}