2012-07-24 29 views
13

C++11 numaralı telefondan using anahtar sözcüğünü kullanarak bir sorun yaşadım. Şimdi başka bir yaklaşım kullanmaya karar verdim (aşağıdaki örnekte yorum olarak eklenmiştir). Y'un bir matris olarak X'u bir matris olarak düşünebilir ve amaç Y’da bulunan X imlenen matris türüne erişmektir. X<A,B> 'da ve X<B,A> yerine, daha güçlü olan ve iki şablon parametresinin kendisini alan bir Sibling takma adı tanımlayan başka bir yaklaşım kullanırız. C++ 11 `using` anahtar kelimesi: şablon parametresinin şablon takma adını özelleştirin

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 

Ben g++-4.7 -std=c++11 -c Yukarıdaki kod derleme çalıştı ve bana aşağıdaki hata mesajı gösterir:

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 

bir hiç bir hata mesajı ya da ben bunu düzeltmek nasıl neden anlamıyorum. Birisi bana sorunun ne olduğunu açıklayabilir mi?

Çok teşekkürler! Bir şablon var,

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

bu durumda (Sibling) içinde :: sağındaki tanımlayıcı bir tür değildir ve bu disambiguator olduğunu bu yüzden:

cevap

9

yerine ::templatetypename bırakın ve kullanmak gerekir typename yerine gerekli.

+3

Bu yanlıştır. Ayrıca burada 'typename' anahtar sözcüğüne de ihtiyacınız vardır, çünkü A :: Sibling <...>' burada bağımlı bir scoped türüdür. –

8

İşte Clang böyle diyor:

<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 
İlgili konular