[英]Passing anonymous classes to private member functions
是否可以使用匿名命名空間中定義的類作為私有成員函數中的參數? 我還沒有找到一種方法來在頭文件中聲明AnonymousHelperClass。
// C.h
class C
{
// ...
private:
void Boing(AnonymousHelperClass &helper);
};
。
// C.cpp
namespace
{
class AnonymousHelperClass
{
// . . .
};
}
C::Boing(AnonymousHelperClass &helper)
{
// ...
}
不,因為無法在頭文件中命名類型。
但是,您可以將私有成員函數轉換為模板:
// 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文件中的命名空間范圍函數。
不,因為未命名的命名空間 (實際上它們實際上被稱為)在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
命名空間中,但由於只有編譯器知道此名稱,因此無法完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.