2010-03-15 39 views
47

Tôi đang phát xung quanh với các mẫu. Tôi không cố gắng để tái tạo lại std :: vector, tôi đang cố gắng để có được một nắm bắt templateting trong C + +.Cấu trúc có biến mẫu trong C++

Tôi có thể làm như sau không?

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

Những gì tôi đang cố gắng làm là một phiên bản templated cơ bản của:

typedef struct{ 
    size_t x; 
    int *ary; 
}iArray; 

Dường như nó làm việc nếu tôi sử dụng một lớp thay vì cấu trúc, như vậy là nó không thể với cấu trúc typedef ?

Trả lời

106

Vấn đề là bạn không thể tạo mẫu typedef, cũng không cần phải nhập cấu trúc typedef trong C++.

Sau đây sẽ làm những gì bạn cần

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

+1 để giải thích sự khác biệt giữa mã của bạn và @ monkeyking. – rcollyer

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

Bạn không cần làm rõ ràng typedef cho lớp và cấu trúc. Bạn cần số typedef để làm gì? Hơn nữa, các typedef sau khi một template<...> là cú pháp sai. Chỉ cần sử dụng:

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

Tên cấu trúc ở đâu? :) – GManNickG

+0

@GMan: Đã cập nhật. – dirkgently

+0

Hm, ý bạn là đặt nó sau cấu trúc? – GManNickG

5

Bạn có thể template một struct cũng như một lớp. Tuy nhiên, bạn không thể tạo mẫu typedef. Vì vậy, template<typename T> struct array {...}; hoạt động, nhưng template<typename T> typedef struct {...} array; thì không. Lưu ý rằng không cần dùng thủ thuật typedef trong C++ (bạn có thể sử dụng các cấu trúc không có công cụ sửa đổi struct tốt trong C++).

4

Tiêu chuẩn nói (tại 14/3. Đối với các folks phi tiêu chuẩn, những tên sau đây một cơ thể định nghĩa lớp (hoặc các loại trong một tuyên bố nói chung) là "declarators")

Trong một khai báo mẫu, khai báo rõ ràng, hoặc sự khởi tạo rõ ràng, danh sách init-declarationator trong dec-laration sẽ chứa tối đa một người khai báo. Khi khai báo như vậy được sử dụng để khai báo một mẫu lớp, thì không có người khai báo nào được phép.

Làm như chương trình Andrey.

3

Cú pháp sai. Bạn phải xóa typedef.

3

Từ các câu trả lời khác, vấn đề là bạn đang tạo khuôn mẫu cho typedef. Cách "duy nhất" để làm điều này là sử dụng một lớp templated; tức là lập trình meta mẫu cơ bản.

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 
    } 
}