如果您之前已经看过这个问题但是还没有得到解答,请道歉。基本上在我的代码中我有两个结构,在单独的标题中定义并在整个项目中全局使用。我只是希望在其他cpp文件中使用两个结构(在两个单独的头文件中定义),而不仅仅是头文件所属的结构。 以下是我测试的一些示例代码:
class1.h
#include "class2.h"
#include <vector>
#include <string>
struct trans1{
string name;
};
class class1 {
private:
vector <trans2> t2;
public:
class1();
};
class2.h
#include "class1.h"
#include <vector>
#include <string>
struct trans2{
string type;
};
class class2{
private:
vector <trans1> t1;
public:
class2();
};
错误日志:
In file included from class1.h:3:0,
from class1.cpp:1:
class2.h:21:13: error: 'trans1' was not declared in this scope
vector <trans1> t1;
^
class2.h:21:19: error: template argument 1 is invalid
vector <trans1> t1;
^
class2.h:21:19: error: template argument 2 is invalid
我知道这在现实世界的应用程序中是荒谬的代码,但这是我演示的最简单的方法。
值得注意的是,如果我只是简单地在“私人”下注释出向量t1或t2的声明:&#39;代码编译必定。这只是我使用第二个结构的事实。
有人帮忙吗?感谢。
答案 0 :(得分:1)
简单地向前声明将要使用的类。将所有实现代码放入cpp文件中,而不是标题中的内联。
将矢量设为私有。这样,包含标头的文件就不会强制代码生成不完整的类。
答案 1 :(得分:0)
你可以尝试在class2.h中转发声明trans1,在class1.h中转发trans2,如下所示:
class2.h:
// includes
struct trans1;
// rest of your code
在class1.h 中同样的事情(但使用trans2)
不要忘记在代码中添加Include警卫!
答案 2 :(得分:0)
如果您要在单个.cpp文件中执行此操作,解决方案将是微不足道的:
struct trans1 { ... };
struct trans2 { ... };
class class1 { ... };
class class2 { .... };
现在您只需重新排列代码即可在每个翻译单元中获得此结果。 (文件中类/结构的顺序很重要)
答案 3 :(得分:0)
你需要把&#34; trans&#34;将结构放在自己的头文件中,并将它们包含在类头文件中。
您可以转发声明它们,但这需要更改矢量以使用指针。 (在这种情况下,我会建议std::vector<std::unique_ptr<trans>>
)。如果结构庞大而复杂,这可能是合适的。
前向声明方法的主要优点是减少编译时间。但是,如果结构实际上非常简单,那么我不会在这里使用指针的额外开销。