C ++의 템플릿 클래스 클래스 템플릿
-
11-09-2019 - |
문제
여기서 Noob는 여전히 템플릿을 실험하고 있습니다. 메시지 처리 클래스 템플릿을 작성하려고합니다
template <typename T> class MessageProcessor {
//constructor, destructor defined
//Code using t_ and other functions
foo( void ) {
//More code in a perfectly fine method
}
private: T *t_
};
모두 헤더 파일에 정의되었습니다. 나는 수업을 구축하고 테스트했으며 모든 것이 잘되었습니다. 자, 나는 이것을하려고 노력하고있다 :
template <typename T> class MessageProcesor {
//Same stuff as before
foo(void) {
//Same code as before in foo, but one new line:
t_->getMessageSender<MessageType>();
}
private: T *t_;
};
그러나이 라인은 나에게 '>'토큰 전에 나쁜 표현식 유형의 오류를 제공합니다.
Messagetype이 무엇인지 정의하기 위해 필요한 헤더 파일을 추가했습니다. 이 기능을 여러 번 사용했지만이 맥락에서는 그렇지 않았습니다.
컴파일러가 정의되지 않은 클래스 템플릿 내에서 템플릿 함수가 완전히 정의 된 (특수화?)가 마음에 들지 않는다고 생각합니다. 나는 템플릿을 '전문화'로 만드는 것을 완전히 맥주하지 않습니다. 대부분의 설명은 '전체'또는 '부분'개념을 중심으로하지만 처음에는 전문화되는 것은 아닙니다.
더 많은 코드를보고 싶다면 사과드립니다. 나는 직장에서 인터넷에 액세스 할 수 없으며 그곳 에서이 일을하고 있으므로 모든 것을 정신적 '스크래치 패드'에 넣고 집으로 가져와야합니다.
해결책
멤버 기능 'foo'는 반환 유형이 필요하며 종속 표현식에서 멤버 템플릿을 사용할 때 키워드 '템플릿'을 사용해야합니다 (일반적인 템플릿 매개 변수에 직접 또는 간접적으로 의존하는 표현식).
t_->template getMessageSender<MessageType>(); // ok
t_->getMessageSender<MessageType>(); // not ok
아마도이 예는 회원 템플릿이있을 때 감사하는 데 도움이 될 것입니다. 필요합니다 '템플릿'키워드에 의해 접두어를 접두약으로 만들려면 [참고 : 대칭의 이익은 항상 멤버 템플릿에서 '템플릿'접두사를 사용할 수 있지만, 비 의존적 표현식에서 사용될 때 선택 사항입니다.
struct MyType
{
template<class T> void foo() { }
};
template<class U>
struct S
{
template<class T>
void bar()
{
MyType mt; // non-dependent on any template parameter
mt.template foo<int>(); // ok
mt.foo<int>(); // also ok
// 't' is dependent on template parameter T
T t;
t.template foo<int>(); // ok
t.foo<int>(); // not ok
S<T> st; // 'st' is dependent on template parameter T
st.template foo<int>(); // ok
st.foo<int>(); // not ok
S<MyType> s; // non-dependent on any template parameter
s.bar<int>(); // ok
s.template bar<int>(); // also ok
}
};
도움이되기를 바랍니다.
다른 팁
키워드를 추가하십시오 template
~ 사이 ->
그리고 템플릿 메소드의 이름 :
t_->template getMessageSender<MessageType>();
아마도 Messagetype은 그 시점에서 알려지지 않았습니다. 포함, 네임 스페이스 해상도 또는 선언이 누락 되었습니까?
그렇지 않다면, 어떻습니까? getMessageSender
선언 된 방법 MessageType
?
일반적으로 C ++에서는 T가 그 시점에서 알 수 없다면 문제가되지 않습니다 (음 ... 복잡하지만 여전히).
또한 오류 메시지에는 일반적으로 소송을 시도하는 유형이 포함됩니다. 최소한 전체 오류 메시지를 게시하십시오.
GetMessagesender와 같은 메소드와 템플릿이있는 다른 유사한 호출이 있습니까?
t_->getMessageSender<MessageType>();
누락 된 기능의 반환 유형 일뿐입니다. 그만큼 t_
멤버는 완전히 정의되어 있습니다.
템플릿의 전문화는 특정 템플릿 인수를위한 '특별'버전입니다. An example: std::vector
일반 버전의 일반 버전입니다 std::vector
.
부분 전문화는 모든 템플릿 인수가 제공되지는 않는 제네릭 코드의 구현입니다.
이것은 Visual Studio 2010 컴파일러에서 잘 작동합니다.
class One
{
public:
void newFoo() ;
template < class T > void foo()
{
T obj ; // obj is dependent on template parameter
obj.newFoo() ; // and this works
}
}
답을 업데이트하기 위해 !!!