【发布时间】:2011-06-14 17:09:26
【问题描述】:
我在尝试编写的 C++ 库时遇到问题。这是通常的设置,一个cpp文件,一个头文件。我希望头文件只公开要使用的部分(例如,我有一个抽象基类,我不希望在头文件中)。到目前为止,我只处理一个文件(我认为这应该没有什么区别,因为包含是由预处理器完成的,它不关心任何事情)。
您会注意到“头文件”分布在两个位置,即头实现文件之前和之后。
#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> 的成员。我不想将类声明本身放在标题中的原因是它会(因为我理解它),包含所有我想隐藏的私人和类似的东西。
也许只有我一个人,但下面的头文件似乎“不好”,至少作为“接口规范”。它暴露了 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。问题只是为了得到看起来像我想要的东西,我需要将标题拆分为实现代码上方的一部分,以及它下方的一部分。这有意义吗?
标签: c++ templates class namespaces header-files