C++11
에 using
키워드를 사용하는 중 문제가 발생했습니다. 나는 지금 다른 접근법을 사용하기로 결정했다. (아래 예제에서 주석으로 추가). 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는 그 이유는 다음과 같습니다
이 올바르지 않습니다. 'A :: Sibling <...>'은 의존적으로 범위가 지정된 유형 이름이기 때문에 여기에'typename' 키워드가 필요합니다. –