2011-08-24 67 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

相关问题