Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将匿名类传递给私有成员函数_C++ - Fatal编程技术网

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

C++ 将匿名类传递给私有成员函数,c++,C++,是否可以将匿名命名空间中定义的类用作私有成员函数中的参数?我还没有找到在标题中转发声明匿名HelperClass的方法 // C.h class C { // ... private: void Boing(AnonymousHelperClass &helper); }; 否,因为无法在头文件中命名类型 但是,您可以将私有成员函数转换为模板: // C.h class C { public: void Foo(); private: template &

是否可以将匿名命名空间中定义的类用作私有成员函数中的参数?我还没有找到在标题中转发声明匿名HelperClass的方法

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


否,因为无法在头文件中命名类型

但是,您可以将私有成员函数转换为模板:

// C.h
class C
{
public:

    void Foo();

private:
    template <typename TAnonymousHelper>
    void Boing(TAnonymousHelper&);
};

尽管如此,只需要修改逻辑,使得私有成员函数可以是.CPP文件中的命名空间范围函数。

< P>不,因为在C++标准中定义了未命名的命名空间(这就是它们所调用的名称):

7.3.1.1未命名名称空间[名称空间.未命名]

一,。未命名的命名空间定义的行为就像它被替换为

    namespace unique { /* empty body */ }
    using namespace unique;
    namespace unique { namespace-body }
其中,翻译单元中出现的所有unique替换为 相同的标识符,此标识符与所有其他标识符不同 整个程序中的标识符

因此,在你的课堂上,它相当于:

namespace SomeUniqueNameGeneratedByTheCompiler {}
using namespace SomeUniqueNameGeneratedByTheCompiler;
namespace SomeUniqueNameGeneratedByTheCompiler
{    
    class AnonymousHelperClass    
    {    
        // . . .     
    };    
}
因此,
匿名帮助类
的完整限定是
:由compiler::AnonymousHelperClass
生成的唯一名称,而不是
::AnonymousHelperClass
。所以即使你这么做了:

class AnonymousHelperClass; // Forward declaration

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

该转发声明引用了另一个
匿名HelperClass
。您可以在compiler命名空间生成的
someuniquename中提出前向声明,但由于只有编译器知道此名称,因此无法进行此操作。

如果您这样做,编译器将选择不同的唯一名称。
namespace SomeUniqueNameGeneratedByTheCompiler {}
using namespace SomeUniqueNameGeneratedByTheCompiler;
namespace SomeUniqueNameGeneratedByTheCompiler
{    
    class AnonymousHelperClass    
    {    
        // . . .     
    };    
}
class AnonymousHelperClass; // Forward declaration

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