2011-08-24 66 views
3

是否可以將在匿名名稱空間中定義的類用作私有成員函數中的參數?我還沒有找到一種方法來轉發標頭中的聲明AnonymousHelperClass。將匿名類傳遞給私有成員函數

// C.h 
class C 
{ 
    // ... 
private: 
    void Boing(AnonymousHelperClass &helper); 
}; 

// C.cpp 
namespace 
{ 
    class AnonymousHelperClass 
    { 
    // . . . 
    }; 
} 

C::Boing(AnonymousHelperClass &helper) 
{ 
    // ... 
} 

回答

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文件中的命名空間範圍函數。

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命名空間中,但由於只有編譯器知道此名稱,因此無法完成。

+0

如果你這樣做了,編譯器會選擇一個不同的唯一名稱。 – Daniel

相關問題