【发布时间】:2018-05-16 05:33:20
【问题描述】:
我有两个 C++ 类:
- 第一个类包含一个指向第二个类的指针,并具有通过指针调用第二个类的公共方法的模板函数。由于是模板,该函数已在类声明中定义。
- 第二类允许第一类通过友谊机制访问其私有成员。
鉴于此,我的问题是:如何组织这种情况下的源/标头/前向声明? 无论我尝试了什么,它都无法编译为目标文件。
一个序列是这样的:
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++独有的吗?
【问题讨论】:
-
由于
c2->Func();不使用模板参数,您将其移至常规成员函数。 -
@RSahu 这只是一个非常简化的示例。我需要在我的实际大项目中保留它!
标签: c++ templates friend forward-declaration