如何组织包含模板和好友混合的班级?
How to organize classes containing mixture of templates and friends?
我有两个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++ 独有的吗?
移动已知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文件中都#include
d。
相关文章:
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- D3D11-将混合权重和索引传递到顶点着色器
- 为什么我的好友类无法访问私人会员?
- 为什么派生类的好友不能使用受保护的成员?
- C++分数混合比较运算符错误
- 解析模板的好友功能时出现问题
- 消除好友和成员二进制运算符的歧义
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 好友函数的工作原理
- 如何在 Python C++ 混合库中调试非确定性分段错误?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- C++11 中的混合列表初始化
- C++以迭代方式搜索混合类型地图
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 混合 Rcpp 模块和 Rcpp::export
- C++11 中好友模板类的视觉C++错误
- 如何组织包含模板和好友混合的班级?