我有模板函数,比如说,
template<class T>
void mysort(std::vector<T>& vec)
{
size_t b, m, e,
...
mysort(vec, b, m, e);
}
template<class T>
void mysort(std::vector<T>& vec, size_t b, size_t m, size_t e)
{
size_t x, y, z;
...
mysort (vec, x, y, z);
}
公共(public)接口(interface)是只接受 vector 引用的接口(interface)。我想隐藏另一个,实现,这样没有客户端代码可以做
mysort(vec, a, b, c);
创建一个类并使实现函数私有(private)静态感觉不太对,我尝试使用匿名命名空间,
namespace abc
{
namespace
{
template<class T>
void mysort(std::vector<T>& vec, size_t b, size_t m, size_t e)..
}
template<class T>
void mysort(std::vector<T>& vec)...
}
它有帮助,但不完全是淘汰赛......
#include "mysort.h"
int main()
{
...
abc::mysort(vec, a, b, c); // this won't compile, good
}
但是,如果我将其更改为:
#include "mysort.h"
using namespace abc;
int main()
{
...
mysort(vec, a, b, c); // it compiles and runs!!
}
我在 x86_64 上使用 gcc Ubuntu 4.4.3-4ubuntu5。
谁能解释为什么它使用 using 指令编译,而不是使用限定名称编译,以及是否有更好的方法来实现我想要的?
最佳答案
对此的常见习惯用法是创建一个“详细信息”命名空间,该命名空间仅用于内部使用的代码:
namespace abc
{
namespace detail
{
template<class T>
void mysort(std::vector<T>& vec, size_t b, size_t m, size_t e)..
}
template<class T>
void mysort(std::vector<T>& vec)...
}
要回答有关未命名命名空间行为的问题:
未命名的命名空间(它们不被称为匿名命名空间)的命名有点奇怪——它们对您来说是未命名的,但编译器实际上为它生成了一个唯一的内部名称。你的例子相当于:
namespace abc
{
namespace def // lets say 'def' is unique.
{
template<class T>
void mysort(std::vector<T>& vec, size_t b, size_t m, size_t e)..
}
using namespace def;
template<class T>
void mysort(std::vector<T>& vec)...
}
您会注意到它的行为与您未命名的示例相同:您不能在此处执行
abc::mysort(vec, 1, 2, 3)
,但可以执行 using namespace abc; mysort(vec, 1, 2, 3)
。发生这种情况是因为没有两个
abc::mysort
,只有一个 abc::def::mysort
和 abc::mysort
。当您声明一个实际的 abc::mysort
时,它会隐藏 using namespace def
引入的那个。请注意,如果您注释掉 1-param mysort
,您实际上可以说 abc::mysort(vec, 1, 2, 3)
。因为它是隐藏的,所以对
abc::mysort
的合格调用必须显式查看 abc::mysort
,并且只能找到 1-param 版本。但是,通过
using namespace abc; mysort(vec, 1, 2, 3)
进行非限定调用,它可以使用 ADL 查找任何匹配的可用函数。关于c++ - 如何从客户端的代码中隐藏模板化的非成员函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14060432/