2010-12-12 8 views
0

typedef VertexType VertexType;//A 행을 GraphMatrixclass에 추가하면이 코드가 컴파일을 통과하고 작동합니다. 그렇지 않으면 컴파일 오류가 발생합니다. 오류 : C2039 : 'VertexType': 'GraphMatrix'의 구성원이 아닙니다. 내 질문은 '이 바보 같은 줄을 추가하지 않고 위의 코드 작업을 만드는 방법 (구문)입니다 //A'?typedef를 피하는 방법은 무엇입니까?

답변

1

항상 VertexType의 정규화 된 이름을 쓸 수 있으며 typedef은 그 이름을 범위로 가져오고 더 깨끗한 코드를 작성할 수있는 바로 가기입니다.

따라서 아니요이 경우에는 다른 방법이 없습니다.

그러나 상속을 사용하는 경우 using BaseClass::something을 사용하여 범위에 가져올 수 있습니다.

-1

나는 그렇게 의심한다.

Graph 템플릿의 관점에서 GraphType 템플릿 매개 변수는 형식 이름입니다 (이 경우 "클래스"). 따라서 GraphGraphType = GraphMatrix<int>으로 인스턴스화 된 경우 Graph은 템플릿 인스턴스 또는 "일반"클래스를 수신했는지 여부를 확인할 수 없습니다. 따라서 GraphType에는 템플릿 매개 변수가 없어도 템플릿 매개 변수에 액세스 할 수 없습니다.

GraphType에 typedef를 도입하면 GraphMatrix 템플릿의 모든 인스턴스가 인스턴스화 된 정확한 유형에 대한 공개 정보 (즉 달성하려는 것)가 풍부 해집니다.

+0

사실이 아닙니다 -'Graph'는'GraphType'이 전문화를 통해 하나의 매개 변수가있는 템플릿인지 확인할 수 있습니다. – jpalecek

+0

하지만 구현체가 constract에 의존하는 것이 좋습니다. "typedef가있는 클래스로 인스턴스화 될 것입니다."VertexType "보다"항상 발생하는 템플릿 클래스로만 인스턴스화 될 것입니다. 첫 번째 템플릿 매개 변수를 VertexType으로 가져야합니다. " 여기에서 전문화를 사용하는 것은 나에게 hackish처럼 보이고 최소한의 놀라움 원칙을 침해한다, IMHO. 난 내 경우를 휴식. – Kos

1

My question is follows 'is there a way (syntax) to make above code work without adding this stupid line //A

저는 그렇게 생각하지 않습니다.

그러나 코드에 몇 가지 문제가 있습니다. GraphType은 종속 이름이며 GraphType::VertexType이 이전에 typename을 추가해야하는 유형임을 나타냅니다.

그러나 클래스 템플릿을 GraphType = GraphMatrix <int>에 대해 인스턴스화하면 컴파일러에서 GraphMatrix <int>::VertexType을 찾을 수 없으므로 다른 오류가 발생합니다.

그래서 해결하기 위해 오류가

template <class TVertexType> 
class GraphMatrix 
{ 
    public: 
    typedef TVertexType VertexType;  
}; 

또는 유사한 무언가 GraphMatrix의 정의를 변경합니다.

전체 작업 코드 here

+0

오, 난 그냥 typename에 대해 잊어 버렸습니다. 이것은 내가 코드를 복사하지 않고 코드 - 글을 쓰지는 못했지만 포럼 글의 텍스트 영역에 여기에 적어 두었습니다. 그래도 모든 대답에서 GraphMatrix의 typedefing을 피할 방법이 없다는 것을 이해합니다. 답변 해 주셔서 감사합니다 :) –

0

템플릿 - 매개 변수로 전달 된 템플릿 클래스의 인수를 얻고 싶은 경우에, 당신은 GraphType의 허용 종류를 제한해야합니다.당신은 전문화하여이 작업을 수행 :

template <class GraphType> 
class Graph; 

template <template <class> class GraphType, class VertexType> 
class Graph<GraphType<VertexType> > 
{ 
    ... // use GraphType<VertexType> as your graph, VertexType as your vertex type 
}; 

할 수 있습니다 심지어 create a helper struct that will unpack the args for you :

template <class T> struct get_arg; 

template <template <class> class Tpl, class Arg> 
struct get_arg<Tpl<Arg> > 
{ 
    typedef Arg type; 
}; 

참고하지만,이 솔루션은 매우 융통성이다 - 그것은 단지 당신의 Graph 클래스 템플릿 인수로 하나 개의 매개 변수를 사용하여 템플릿을 할 수 있습니다 (GraphMatrix 템플릿에 매개 변수를 추가 한 경우 수행 한 작업을 상상해보십시오. 따라서 일반적으로 사용되지 않습니다.

보통 해결책은 특성 클래스를 사용하여 특성 클래스를 사용하여 클래스에 typedef를 추가하는 것입니다 ("바보 같은 선"으로 수행하는 것처럼).

관련 문제