是否可以使用匿名命名空间中定义的类作为私有成员函数中的参数?我还没有找到一种方法来在头文件中声明AnonymousHelperClass。
// C.h
class C
{
// ...
private:
void Boing(AnonymousHelperClass &helper);
};
。
// C.cpp
namespace
{
class AnonymousHelperClass
{
// . . .
};
}
C::Boing(AnonymousHelperClass &helper)
{
// ...
}
答案 0 :(得分:4)
不,因为无法在头文件中命名类型。
但是,您可以将私有成员函数转换为模板:
// C.h
class C
{
public:
void Foo();
private:
template <typename TAnonymousHelper>
void Boing(TAnonymousHelper&);
};
然后在源文件中定义它并将其与AnonymousHelperClass
:
// C.cpp
#include "C.h"
namespace
{
class AnonymousHelperClass { };
}
template <typename TAnonymousHelper>
void C::Boing(TAnonymousHelper& x) { }
void C::Foo()
{
AnonymousHelperClass x;
Boing(x);
}
尽管如此,重写逻辑可能更容易,因为私有成员函数可以是.cpp文件中的命名空间范围函数。
答案 1 :(得分:2)
不,因为未命名的名称空间(这就是他们实际调用的名称)在C ++标准中定义如下:
7.3.1.1未命名的命名空间[namespace.unnamed]
1。未命名的命名空间定义的行为就像它被
替换一样namespace unique { /* empty body */ } using namespace unique; namespace unique { namespace-body }
其中翻译单元中所有出现的唯一替换为 相同的标识符和此标识符与其他标识符不同 整个计划中的标识符。
所以你的课程相当于:
namespace SomeUniqueNameGeneratedByTheCompiler {}
using namespace SomeUniqueNameGeneratedByTheCompiler;
namespace SomeUniqueNameGeneratedByTheCompiler
{
class AnonymousHelperClass
{
// . . .
};
}
因此AnonymousHelperClass
课程的完整资格为::SomeUniqueNameGeneratedByTheCompiler::AnonymousHelperClass
,而不是::AnonymousHelperClass
。即使你这样做了:
class AnonymousHelperClass; // Forward declaration
class C
{
// ...
private:
void Boing(AnonymousHelperClass &helper);
};
该前向声明指的是不同的AnonymousHelperClass
。您可以将前向声明放在SomeUniqueNameGeneratedByTheCompiler
命名空间中,但由于只有编译器知道此名称,因此无法完成。