2010-04-06 1 views
6

저는 C++을 처음 사용했습니다. A라는 generic 클래스가 있습니다. A에는 B라는 중첩 클래스가 있습니다. A에는 getB()라는 메서드가 포함되어 있습니다.이 메서드는 B의 새 인스턴스를 반환해야합니다. 그러나 컴파일 할 코드를 가져올 수 없습니다. 여기에 보이는 무엇을 좋아합니다 : #include일반 외부 클래스의 중첩 된 내부 클래스에 대한 포인터를 반환하십시오.

template <class E> 
class A { 

public: 
    class B { 
    public: 
     int data; 
    }; 

    B * getB(); 
}; 

A.cpp

#include "A.h" 

template <class E> 
A<E>::B * A::getB() { 
    return new B(); 
} 

나는 이것을 컴파일하려고

, 나는 다음과 같은 오류 얻을 :

error: expected constructor, destructor, or type conversion before '*' token 

을 아무도 내가 뭘 잘못하고 있는지 알아? 빠른 응답 모두에 대한

감사 :

덕분에,

UPDATE를 helixed. 나는 아직도이 일을하는 데 약간의 어려움을 겪고있다.

template <class E> 
class A { 

public: 
    class B { 
    public: 
     int data; 
    }; 

    B * getB(); 
}; 

template <class E> 
typename A<E>::B * A<E>::getB() { 
    return new B(); 
} 

class C { 

}; 
그러나

, 내가 주에서 이것을 사용하려고하면, 나는 오류가 발생

A.h : 여기에 나열된 제안을 복용 후, 나는 이런 식으로 뭔가가있다. 여기 내 주요 방법입니다 :이 컴파일 할 때

MAIN.CPP

#include "A.h" 

int main(int argc, char *argv[]) 
{ 
    A<C> *a = new A<C>(); 
    A<C>::B *b = a.getB(); 
} 

, 나는 다음과 같은 오류 얻을 : 빠른 응답을 다시

error: request for member 'getB' in 'a', which is of non-class type 'A<C>*' 

감사합니다.

는 컴파일러가 "B"는 "A"는 템플릿되는 유형인지 알 수있을만큼 똑똑하지 않다

+3

흠을 꼬모에서 작동 .그러나 이것이 컴파일 되더라도 도움이 될까요? getB에 대한 정의는 A.cpp에서만 가능합니다. 템플릿이기 때문에 컴파일러가 "내보내기"를 지원하지 않으면 다른 번역 단위에서 호출 할 수 없습니다. –

+2

편집 응답 : 포인터를 통한 구성원 액세스에는'->'을 사용하십시오. –

+0

오, 이런, 정말 바보 같아. 나는 자바에서 너무 많은 시간을 보냈다. 스티브 도움에 감사드립니다. – LandonSchropp

답변

7

을 helixed. typename을 사용해보십시오.

template <class E> 
typename A<E>::B * A<E>::getB() { 
    return new B(); 
} 
+0

Steve Jessop이 언급했듯이 .cc 파일이 아니라 .h 파일에 보관하십시오. – Stephen

+0

이것은 원래의 문제를 수정하는 것처럼 보였습니다. 그러나 위에 게시 한 것처럼 여전히 약간의 문제가 있습니다. 도와 주셔서 감사합니다. – LandonSchropp

+0

사용 : " :: B * b = a-> getB();" "a"포인터를 역 참조 할 필요가 있습니다. – Stephen

2

컴파일러가 B 유형임을 알기 위해 정의에서 typename을 사용해야합니다. 업데이트에

template <class E> 
typename A<E>::B * A::getB() { 
    return new B; 
} 
+0

귀하의 요지를 봅니다. 정의를 A.h 파일로 옮겼습니다. 감사. – LandonSchropp

0

답변 : 당신이 명시 적으로 delete 메모리가 할당해야하기 때문에

당신은, 당신은하지 않았다 경우 사실, 그것은 가장 좋은 것입니다, C++에서 new 모든 것을 할 필요가 없습니다 스마트 포인터를 사용하십시오.

그래서, 여기에 코드를 개정 : 당신이 newA<C> 클래스를하고자하는 경우

template <class E> 
class A { 

public: 
    class B { 
    public: 
     int data; 
    }; 

    B getB(); // Object, not pointer 
}; 

template <class E> 
typename A<E>::B A<E>::getB() { 
    return B(); 
} 

#include "A.h" 

int main(int argc, char *argv[]) 
{ 
    A<C> a = A<C>(); 
    A<C>::B b = a.getB(); 
} 

가, 다음 방법을 호출 할 operator->를 사용해야합니다 :

A<C>::B b = a->getB();