将匿名类传递给私有成员函数

时间:2011-08-24 20:23:31

标签: c++

是否可以使用匿名命名空间中定义的类作为私有成员函数中的参数?我还没有找到一种方法来在头文件中声明AnonymousHelperClass。

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

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

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

2 个答案:

答案 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命名空间中,但由于只有编译器知道此名称,因此无法完成。