次のようなクラス テンプレートがあります。
foo.h
template<class C>
class Foo
{
public:
void memberFunc();
};
#include "foo.tpp"
foo.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
行われることを忘れていました。.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() {...}
}
しかし、機能しません。関数は、ヘッダーを含むファイルから引き続き使用できます。
これらのヘルパー関数を外部コードから隠す方法はありますか?