문제

여기서 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
    }
}

답을 업데이트하기 위해 !!!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top