2013-10-04 29 views
18

Tôi đang gặp phải khó khăn lớn trong việc khai báo một loại templated như hình dưới đây.tuyên bố mẫu của `typedef typename Foo <T> :: Bar Bar '

#include <cstdlib> 
#include <iostream> 

using namespace std; 


template <class T> 
class Foo 
{ 
typedef T Bar; 
}; 

template <class T> 
typedef typename Foo<T>::Bar Bar; 




int main(int argc, char *argv[]) 
{ 

    Bar bar; 

    Foo<int> foo; 


    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

tôi nhận được lỗi

template declaration of `typedef typename Foo<T>::Bar Bar' 

về dòng

template <class T> 
typedef typename Foo<T>::Bar Bar; 

Tôi làm điều này vì tôi muốn tránh phải viết typename Foo :: Bar Xuyên mã của tôi.

Tôi đang làm gì sai?

Trả lời

29

Tuyên bố typedef trong C++ không được là mẫu. Tuy nhiên, C++ 11 thêm một cú pháp thay thế bằng việc kê khai using cho phép bí danh kiểu parametrized:

template <typename T> 
using Bar = typename Foo<T>::Bar; 

Bây giờ bạn có thể sử dụng:

Bar<int> x; // is a Foo<int>::Bar 
+0

Cảm ơn bạn! tất cả các bạn đều hữu ích như nhau. Tôi ước tôi có thể chấp nhận cả ba câu trả lời nhận được. Dù sao tôi sẽ bỏ phiếu cho cả ba câu trả lời. – geraldCelente

+2

@geraldCelente: Tôi không nghĩ rằng nó quan trọng hoặc bất cứ ai sẽ khó chịu - chọn câu trả lời bạn thấy hữu ích nhất :-) (Hoặc quăng một đồng xu.) –

+0

là có một thư viện (ví dụ: boost) cung cấp một "backaround "cho các trình biên dịch vẫn đang rơi khỏi bandwagon C++ 11 (như trình biên dịch gcc/mingw)? –

5

typedef 's không thể mẫu. Đây chính xác là lý do C++ 11 phát minh ra các khuôn mẫu bí danh. Hãy thử

template <class T> 
using Bar = typename Foo<T>::Bar; 
+0

Cảm ơn bạn! tất cả các bạn đều hữu ích như nhau. Tôi ước tôi có thể chấp nhận cả ba câu trả lời nhận được. Dù sao tôi sẽ bỏ phiếu cho cả ba câu trả lời. – geraldCelente

5

Bạn không thể typedef mẫu. Tuy nhiên, bạn có thể sử dụng mẫu bí danh. Đoạn mã dưới đây trình bày cách sử dụng và cố định một vài vấn đề khác nữa:

template <class T> 
class Foo 
{ 
public: 
    typedef T Bar; 
}; 

template <class T> 
using Bar = typename Foo<T>::Bar; 

int main(int argc, char *argv[]) 
{ 
    Bar<int> bar; 
    Foo<int> foo; 
} 
+0

Cảm ơn bạn! tất cả các bạn đều hữu ích như nhau. Tôi ước tôi có thể chấp nhận cả ba câu trả lời nhận được. Dù sao tôi sẽ bỏ phiếu cho cả ba câu trả lời. – geraldCelente

0

Hy vọng nó okay để thêm câu trả lời muộn ...

tôi vẫn đang sử dụng VS2012 mà không xuất hiện để thực hiện mẫu alias , vì vậy tôi đã sử dụng để pha chế này cho mục đích của mình:

//map<CWinThread*, AKTHREADINFO<T> > mapThreads; // won't compile 
#define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> > 

... 

MAP_THREADS(T) mapThreads; 

Xin lỗi nó không chứng minh được ví dụ ban đầu, nhưng bạn bị trôi dạt.

Các vấn đề liên quan