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:
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. –