如何组织包含模板和好友混合的班级?

How to organize classes containing mixture of templates and friends?

本文关键字:混合 好友 何组织 包含模      更新时间:2023-10-16

我有两个C++类,这样:

第一个类包含指向第二个类的指针
  1. ,并具有通过指针调用第二个类的公共方法的模板函数。该函数已在类声明中定义,因为它是一个模板。
  2. 第二类允许第一类通过友谊机制访问其私人成员。

鉴于此,我的问题是:在这种情况下,我如何组织源/标头/转发声明? 无论我尝试过什么,它都不会编译为目标文件。

一个序列是这样的:

class Class2;
class Class1
{
Class2 * c2;
public:
template<typename T> T DoSomething(T& X)
{
c2->Func();
return X;
};
void FuncFromClass1();
};
class Class2
{
int data;
public:
Class2() : data(0) {};
void Func();
friend void Class1::FuncFromClass1();
};
void Class2::Func()
{
int i;
}
void Class1::FuncFromClass1()
{
int j;
c2 = new Class2;
c2->data = 1;
}

吠叫invalid use of incomplete type ‘class Class2’因为它不认识c2->Func();. 另一个是:

class Class1;
class Class2
{
int data;
public:
Class2() : data(0) {};
void Func();
friend void Class1::FuncFromClass1();
};
class Class1
{
Class2 * c2;
public:
template<typename T> T DoSomething(T& X)
{
c2->Func();
return X;
};
void FuncFromClass1();
}; 
void Class2::Func()
{
int i;
}
void Class1::FuncFromClass1()
{
int j;
c2 = new Class2;
c2->data = 1;
}

不认识friend void Class1::FuncFromClass1();.

编译尝试为g++ -c -std=c++11 -Wall test.cpp

注意,如果可能的话,我宁愿不把Class1当作完整的朋友,而是只保留一种方法作为朋友来Class2

另外,我还没有在Windows的Visual Studio中尝试过完全相同的示例,但是看到了像所描述的完全同构的情况(在一个更大的项目中(,据我所知,VS没有抱怨。它是 g++ 独有的吗?

移动已知Class2定义的成员函数模板的实现。

class Class2;
class Class1
{
private:
Class2 * c2;
public:
// Delcare, don't define
template<typename T> T DoSomething(T& X);
void FuncFromClass1();
};
class Class2
{
private:
int data;
public:
Class2() : data(0) {};
void Func();
friend void Class1::FuncFromClass1();
};
// Define
template<typename T>
T Class1::DoSomething(T& X)
{
c2->Func();
return X;
};

请注意,如果两个类都在一个 .h 文件中定义,则建议的解决方案很简单。如果类是在单独的 .h 文件中定义的,事情会变得有点复杂。您必须确保定义Class1::DoSomething()的 .h 文件在要使用Class1::DoSomething()的每个.cpp文件中都#included。