我有一个看起来像这样的类模板:
foo.h
template<class C>
class Foo
{
public:
void memberFunc();
};
#include "foo.tpp"
文件.tpp
void Foo::memberFunc()
{
...
}
忽略该.tpp
文件,我这样做只是为了给人一种分离声明和实现的错觉,显然这(有点)用模板是不可能的。
我的实现文件实际上要长得多,在其中我有一些成员函数使用的全局范围帮助函数模板,作为成员函数没有意义的函数,并且我不希望类的用户拥有任何东西与。
template<class C> int helper1() { ... }
template <class C> void helper2() { ... }
template<class C>
void Foo<C>::memberFunc()
{
...
helper1<float>();
...
helper2<C>();
...
}
我一直在.cpp
-implementation 文件中这样做,但我忘记了当我在这个伪造的.cpp
文件版本中这样做时,这些小帮助函数的声明和实现实际上最终在类模板头文件中。这会导致类模板头的用户在他们的命名空间中混杂着在成员函数实现之外无用的辅助函数。
显然我可以把它们放在一个命名空间中:
namespace foo_helpers
{
template<class C> void helper1() {...}
template<class C> int helper2() {...}
}
但它仍然导致外部代码能够使用这些功能。它们只对成员函数的实现很重要,我希望能够反映这一点。
在寻找解决方案时,我了解了未命名命名空间的概念。据我了解,它们只允许当前翻译单元访问其内容。这听起来正是我需要的,所以我将辅助函数更改为:
namespace
{
template<class C> void helper1() {...}
template<class C> void helper2() {...}
}
但它不起作用,这些函数仍然可以从包含标题的文件中使用。
有没有办法从外部代码中隐藏这些辅助函数?