2012-07-24 2 views
13

C++11using 키워드를 사용하는 중 문제가 발생했습니다. 나는 지금 다른 접근법을 사용하기로 결정했다. (아래 예제에서 주석으로 추가). X을 행렬로 생각하면, Y이 믹스되어, X의 행렬 된 행렬 유형 인 Y에 액세스하는 것이 목표입니다. typedef 대신 X<B,A>X<A,B>에 입력하는 대신 더 강력하고 두 개의 템플릿 매개 변수 자체를 사용하는 Sibling 별칭을 정의하는 다른 방법을 사용합니다. C++ 11`using` 키워드 : 템플릿 매개 변수의 템플릿 별명 지정

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 

나는 g++-4.7 -std=c++11 -c와 위의 코드를 컴파일 시도하고 나에게 다음과 같은 오류 메시지가 표시됩니다 :

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 

A가 전혀 오류 메시지가 아니면 고칠 수있는 방법 왜 이해가 안가. 누군가가 내게 그 문제가 무엇인지 설명 할 수 있을까요?

고마워요! 이 템플릿의,

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

이 경우 (Sibling)에서 ::의 오른쪽에있는 식별자가 형식이 아닙니다,이 disambiguator는 그 이유는 다음과 같습니다

답변

9

는 대신 ::templatetypename를 삭제하고 사용할 필요가 typename 대신 필요합니다.

+3

이 올바르지 않습니다. 'A :: Sibling <...>'은 의존적으로 범위가 지정된 유형 이름이기 때문에 여기에'typename' 키워드가 필요합니다. –

8

여기 연타의 말씀입니다 :

<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