작성하려고하는 C++ 라이브러리에 문제가 있습니다. 그것은 보통 설치, 하나의 cpp 파일, 하나의 헤더 파일입니다. 나는 헤더 파일이 단지 (예를 들어 추상적 인 기본 클래스를 가지고 있는데, 나는 헤더 파일에서 원하지 않는) 사용되도록 의도 된 부분을 드러내 길 원한다. 지금까지는 하나의 파일로 작업하고 있습니다 (아무 것도 신경 쓰지 않는 전처리 기가 포함되어 있기 때문에 아무런 차이가 없어야한다고 가정합니다).C++ 클래스 선언 및 네임 스페이스
"헤더 파일"은 헤더 구현 파일 전후의 두 지점에 걸쳐 있습니다.
#include <stdio.h>
// lib.h
namespace foo {
template <class T> class A;
}
// lib.cpp
namespace foo {
template <class T> class A {
private:
T i;
public:
A(T i) {
this->i = i;
}
T returnT() {
return i;
}
};
};
// lib.h
namespace foo {
template <class T> T A<T>::returnT();
}
// foo.cpp
void main() {
foo::A<int> a = foo::A<int>(42);
printf("a = %d",a.returnT());
}
그래서 자연스럽게, 난 그냥
namespace foo {
template <class T> class A;
template <class T> T A<T>::returnT();
}
하지만 내 컴파일러는 returnT
이 foo::A<T>
의 구성원이 아닌 불평 (이 좋아하지 않는를 포함하도록 내 헤더 파일을 싶습니다. 그 이유를 I 클래스 선언 자체를 헤더에 넣고 싶지 않다면 (내가 이해 한대로) 숨기고 싶은 모든 사적인 것과 비슷한 것들을 숨길 수 있습니다.
아마 나, 하지만 다음 헤더 파일은 적어도 "좋지 않은"것 같습니다. "인터페이스 명세"이다.이 라이브러리는 A
의 내부 구조를 노출하는데, lib의 사용자는이를 알 필요가 없다.
// lib.h
namespace foo {
template <class T> class A {
private:
int i;
public:
A(T);
T returnT();
};
}
// lib.cpp
namespace foo {
template <class T> A<T>::A(T i) {
this->i = i;
}
template <class T> T A<T>::returnT() {
return i;
}
};
허용되는 방식입니까? 가능하다면 더 추상적 인 헤더 파일을 원합니다.
코드의 전체 첫 번째 블록 헤더 파일의 코드인가? "lib.h"라는 레이블이 붙은 두 개의 블록이 있기 때문에 혼란 스럽지만 그곳에는'main' 함수가 있습니다. –
'template'이라는 단어를 쓸 때 구현 세부 사항을 공개하는 데 사용됩니다. 이것은 그것이 작동하는 방법, 기간입니다. 메인 헤더에'#include '하는 "구현 헤더 파일"을 만들 수 있지만 소스를 제공해야합니다. –
@James McNellis : 첫 번째 코드 조각 (회색 블록)은 모든 것을 하나의 파일로 유지하는 데 사용 된 테스트 파일입니다. 이것은'lib.h','lib.cpp'와'main.cpp'의 세 파일로 나뉘어지며 마지막은'lib'를 호출하는 "user"테스트입니다. 문제는 내가 원한 것처럼 보이는 것을 얻으려면 머리말을 구현 코드 위의 한 부분으로, 그리고 그 아래의 한 부분으로 분할해야한다는 것입니다. 말이 돼? – Svend