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