typedef VertexType VertexType;//A
행을 GraphMatrix
class
에 추가하면이 코드가 컴파일을 통과하고 작동합니다. 그렇지 않으면 컴파일 오류가 발생합니다. 오류 : C2039 : 'VertexType': 'GraphMatrix'의 구성원이 아닙니다. 내 질문은 '이 바보 같은 줄을 추가하지 않고 위의 코드 작업을 만드는 방법 (구문)입니다 //A
'?typedef를 피하는 방법은 무엇입니까?
답변
항상 VertexType
의 정규화 된 이름을 쓸 수 있으며 typedef
은 그 이름을 범위로 가져오고 더 깨끗한 코드를 작성할 수있는 바로 가기입니다.
따라서 아니요이 경우에는 다른 방법이 없습니다.
그러나 상속을 사용하는 경우 using BaseClass::something
을 사용하여 범위에 가져올 수 있습니다.
나는 그렇게 의심한다.
Graph
템플릿의 관점에서 GraphType
템플릿 매개 변수는 형식 이름입니다 (이 경우 "클래스"). 따라서 Graph
이 GraphType = GraphMatrix<int>
으로 인스턴스화 된 경우 Graph
은 템플릿 인스턴스 또는 "일반"클래스를 수신했는지 여부를 확인할 수 없습니다. 따라서 GraphType
에는 템플릿 매개 변수가 없어도 템플릿 매개 변수에 액세스 할 수 없습니다.
GraphType
에 typedef를 도입하면 GraphMatrix 템플릿의 모든 인스턴스가 인스턴스화 된 정확한 유형에 대한 공개 정보 (즉 달성하려는 것)가 풍부 해집니다.
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
오, 난 그냥 typename에 대해 잊어 버렸습니다. 이것은 내가 코드를 복사하지 않고 코드 - 글을 쓰지는 못했지만 포럼 글의 텍스트 영역에 여기에 적어 두었습니다. 그래도 모든 대답에서 GraphMatrix의 typedefing을 피할 방법이 없다는 것을 이해합니다. 답변 해 주셔서 감사합니다 :) –
템플릿 - 매개 변수로 전달 된 템플릿 클래스의 인수를 얻고 싶은 경우에, 당신은 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를 추가하는 것입니다 ("바보 같은 선"으로 수행하는 것처럼).
- 1. SynchronizationLockException을 피하는 방법은 무엇입니까?
- 2. 음수 값을 피하는 방법은 무엇입니까?
- 3. .pyc 파일을 피하는 방법은 무엇입니까?
- 4. 이중 요청을 피하는 방법은 무엇입니까?
- 5. jquery에서 깜박임을 피하는 방법은 무엇입니까?
- 6. Assembly.LoadFrom 차단을 피하는 방법은 무엇입니까?
- 7. 오라클에서 중복을 피하는 방법은 무엇입니까?
- 8. readlines() 사용을 피하는 방법은 무엇입니까?
- 9. Windows ddk에서 "NTSTATUS", "NT_SUCCESS"typedef를 이해하는 방법은 무엇입니까?
- 10. typedef를 사용하여 특정 유형을 완전히 숨기는 방법은 무엇입니까?
- 11. typedef를 정적으로 사용할 수없는 이유는 무엇입니까?
- 12. MacPorts에서 불필요한 종속성을 피하는 방법은 무엇입니까?
- 13. 유사한 ISR간에 코드 중복을 피하는 방법은 무엇입니까?
- 14. 과도한 매개 변수 전달을 피하는 방법은 무엇입니까?
- 15. 프로세스의 쉘 실행을 피하는 방법은 무엇입니까?
- 16. 시스템 날짜 종속성을 피하는 방법은 무엇입니까?
- 17. 사이트 등록에서 공개 이메일을 피하는 방법은 무엇입니까?
- 18. XSLT에서 빈 속성 생성을 피하는 방법은 무엇입니까?
- 19. 내부 클래스의 이름 충돌을 피하는 방법은 무엇입니까?
- 20. 프로그램의 여러 인스턴스를 피하는 방법은 무엇입니까?
- 21. Java에서 코드 디버깅을 피하는 방법은 무엇입니까?
- 22. WCF에서 시간 초과를 피하는 방법은 무엇입니까?
- 23. PHP 전역 객체 사용을 피하는 방법은 무엇입니까?
- 24. JAXB schemagen 사용시 상속을 피하는 방법은 무엇입니까?
- 25. 리프트에서 아약스 타임 아웃을 피하는 방법은 무엇입니까?
- 26. 미친 명명 규칙을 피하는 방법은 무엇입니까?
- 27. 반복되는 if 문을 피하는 방법은 무엇입니까?
- 28. shared_ptr을 사용하여 메모리 누출을 피하는 방법은 무엇입니까?
- 29. Hadoop을 실행할 때 OutOfMemoryException을 피하는 방법은 무엇입니까?
- 30. Delphi에서 MVC의 순환 알림을 피하는 방법은 무엇입니까?
사실이 아닙니다 -'Graph'는'GraphType'이 전문화를 통해 하나의 매개 변수가있는 템플릿인지 확인할 수 있습니다. – jpalecek
하지만 구현체가 constract에 의존하는 것이 좋습니다. "typedef가있는 클래스로 인스턴스화 될 것입니다."VertexType "보다"항상 발생하는 템플릿 클래스로만 인스턴스화 될 것입니다. 첫 번째 템플릿 매개 변수를 VertexType으로 가져야합니다. " 여기에서 전문화를 사용하는 것은 나에게 hackish처럼 보이고 최소한의 놀라움 원칙을 침해한다, IMHO. 난 내 경우를 휴식. – Kos