2012-07-24 39 views
13

Tôi đã gặp sự cố ngày hôm nay bằng cách sử dụng từ khóa using trong C++11. Tôi đã quyết định sử dụng cách tiếp cận khác ngay bây giờ (được thêm vào dưới dạng ý kiến ​​trong ví dụ bên dưới). Bạn có thể coi X là ma trận, trong số Y làm bản mixin và mục đích là truy cập loại ma trận tạm thời là X trong Y. Thay vì typedef ing X<B,A> trong X<A,B>, chúng tôi thực hiện một cách tiếp cận mạnh hơn và xác định bí danh Sibling có hai thông số mẫu.C++ 11 `using` keyword: chuyên mẫu bí danh của tham số mẫu

template <class A, class B> 
struct X 
{ 
    using Left = A; 
    using Right = B; 
    template <class T1, class T2> 
    using Sibling = X<T1, T2>; 
    // using Reversed = X<B, A>; // What I really want and use now. :-) 
}; 

template <class A> 
struct Y 
{ 
    using Left = typename A::Left; 
    using Right = typename A::Right; 
    using AReverse = typename A::Sibling<Right, Left>; // Gives a compiler error 
    // using AReverse2 = typename A::Reversed; // Works, of course. 
}; 

using Z = X<int,double>::Sibling<double,int>; // Works 

tôi đã cố gắng biên dịch mã trên với g++-4.7 -std=c++11 -c và nó cho thấy tôi thông báo lỗi sau:

t.cpp:16:9: error: expected nested-name-specifier before ‘AReverse’ 
t.cpp:16:9: error: using-declaration for non-member at class scope 
t.cpp:16:18: error: expected ‘;’ before ‘=’ token 
t.cpp:16:18: error: expected unqualified-id before ‘=’ token 

Tôi không hiểu tại sao một nhận được một thông báo lỗi ở tất cả hoặc làm thế nào tôi có thể sửa chữa nó. Ai đó có thể giải thích cho tôi vấn đề là gì?

Cảm ơn rất nhiều!

Trả lời

9

Bạn cần phải thả các typename và sử dụng ::template thay vì:

using AReverse = A::template Sibling<Right, Left>; 

Từ định ở bên phải của :: trong trường hợp này (Sibling) không phải là một loại, đó là một mẫu, và đó là lý do tại sao disambiguator đây là cần thay vì typename.

+3

này là không chính xác. Bạn cũng cần từ khóa 'typename' ở đây, bởi vì' A :: Sibling <...> 'là một tên kiểu có phạm vi phụ thuộc ở đây. –

8

Đây là những gì Clang nói:

<stdin>:16:32: error: use 'template' keyword to treat 'Sibling' as a dependent template name 
    using AReverse = typename A::Sibling<Right, Left>; // Gives a compiler error 
          ^
           template 
Các vấn đề liên quan