2011-06-27 43 views
11

Tôi có một mã như:lồng nhau-tên-specifier

namespace mymap { 
    template <class Key,template <typename T > class Allocator> myownmap { 
     typedef pair<const unsigned int, Key> typename _myPair; 
     typedef multimap<unsigned int, Key,less<Key> ,Allocator<_myPair> > typename _entriesType; 
    } 
} 

Nó biên dịch thành công (và các công trình) theo MSVC, nhưng gcc đang phàn nàn về cú pháp hợp lệ:

.hpp:20: error: expected nested-name-specifier before ‘_myPair’ 
.hpp:20: error: two or more data types in declaration of ‘_myPair’ 

những gì tôi làm sai?

+2

bạn có thực sự kiểm tra mã này bằng gcc không? bạn đang thiếu một lớp/cấu trúc trước khi myownmap và "entriesPair" không xảy ra ở bất kỳ đâu trong đoạn mã của bạn. – Philipp

+0

Bạn có thể hiển thị cho chúng tôi định nghĩa 'entriesPair' không? –

+0

'myownmap' là gì? nó là một hàm hay lớp? – iammilind

Trả lời

16

Không cần thiết phải có typename ở đó và do đó không được phép.

MSVC không phân tích mẫu chính xác cho đến khi chúng thực sự được sử dụng, do đó, một số lỗi không được tìm thấy cho đến sau này.

3

"mong muốn tên lồng nhau-specifier" có nghĩa là sau typename từ khóa bạn dự kiến ​​sẽ sử dụng một số tên lồng nhau của tham số mẫu, ví dụ typedef typename Key::iterator .... Trong trường hợp của bạn, bạn không phải sử dụng typename.

4
typedef pair<const unsigned int, Key> /*typename*/ _myPair; 
             ^^^^^^^^^^^^ not needed 

Xem gcc-4.5 output here. (điều này đúng với myownmapclass hoặc chức năng)