gpt4 book ai didi

c++ - 当 typedef 的完整类型将具有未知形式时,我可以前向声明 typedef 吗?

转载 作者:行者123 更新时间:2023-11-30 04:15:25 24 4
gpt4 key购买 nike

问题的简单版本:

库.h

 typedef library::whatever::something::complicated X;

我可以在不包含 library.h 的情况下转发声明 X 吗?


基本上我想做的是:

Foo.h :

// forward declare X

void foo (const X &);

酒吧.h :

#include <library>
typedef library::type<blah>::whatever Bar;
typedef Bar X;

Foo.cpp :

#include <Foo.h>
#include <Bar.h>

foo (const X &) {...

main.cpp :

#include <Foo.h>
#include <Bar.h>

foo (X ());

前提是我不想必须包含<library>除非我必须。假设它与其他 header 的交互很糟糕,但是这些其他 header 需要声明 foo .人们将无法调用 foo()不包括库,但这是 .cpps 需要担心的事情。

如果我想让 X 类型定义为普通类 C,则前向声明 C 就足够了,但这在这里行不通。

我可以将 X 转发声明为 typedef,但据我所知,前提是我已经有了 library::type<blah> 的定义。 (也许还有 blah 的定义)。

前向声明的全部意义在于不 #include这些类型的定义。

这里有一个相关的问题:

namespace std
{
template <typename T>
class vector;
}

typedef std :: vector <int> Buffer;

void foo (const Buffer &);

#include <vector> // ok until here

int main ()
{
foo (Buffer ());
}

在这种情况下,std::vector 的前向声明与定义不兼容。让我们假装我真的真的不想#include <vector> (或者它是什么外部类)。

有解决办法吗?

最佳答案

您不能转发声明嵌套类,请参阅 this answer .

但是,如果你的类不是嵌套的,你可以这样做:

// inside library_fwd.hpp:
namespace library {
namespace whatever {

template <class T>
class Something;
typedef Something<int> IntSomething;

} // namespace whatever
} // namespace library

和:

// inside foo.cpp
#include "library_fwd.hpp"
void foo(const library::whatever::IntSomething&);

std::vector 示例的问题与声明冲突有关。参见 std::vector .修复:

namespace std {
template <class T>
class allocator;

template <typename T, class Allocator>
class vector;
}

typedef std::vector<int, std::allocator<int>> Buffer;

void foo(const Buffer &);

#include <vector> // now ok

int main () {
foo (Buffer ());
}

PS 一些标准库前向声明的例子:http://en.cppreference.com/w/cpp/header/iosfwd

关于c++ - 当 typedef 的完整类型将具有未知形式时,我可以前向声明 typedef 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299376/

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