gpt4 book ai didi

c++ - 如何组织包含模板和 friend 混合的类?

转载 作者:行者123 更新时间:2023-11-28 04:40:09 25 4
gpt4 key购买 nike

我有两个 C++ 类:

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

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

一个序列是这样的:

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;
}

Barks 不完整类型“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() 的每个 .cpp 文件中定义了 #included 的 .h 文件 Class1::DoSomething().

关于c++ - 如何组织包含模板和 friend 混合的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50363089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com