C++ 指向类型不完整的typedef的指针

C++ 指向类型不完整的typedef的指针,c++,C++,有没有办法声明指向将由typedef在实现中设置的不完整类型的指针 以下是我想要的示例: #ifndef TEST_H #define TEST_H namespace std { class string; // THIS WON'T WORK! } struct Test { std::string *value; }; #endif string是basic_string的typedef,因此示例中的代码不起作用。我可以声明一个不完整的std::basic_字符串类

有没有办法声明指向将由typedef在实现中设置的不完整类型的指针

以下是我想要的示例:

#ifndef TEST_H
#define TEST_H

namespace std {
    class string; // THIS WON'T WORK!
}

struct Test {
    std::string *value;
};

#endif
string是basic_string的typedef,因此示例中的代码不起作用。我可以声明一个不完整的std::basic_字符串类型,但这看起来像是一个解决方法

我知道编译器不会为typedef生成符号,而且可能会在不同文件中的不同类型的typedef中使用相同的名称。但是,由于指针是指针(至少是指向编译器的),所以应该可以这样做

编辑:这只是一个极简主义工作示例。在我真正的问题中,我有一个Facade,它使用一个库中的类,只有Facade需要知道(不,它不是std::string,库也不是stl)。我并不真的担心循环包含,但由于我的项目中有很多文件(直接或间接)都包含这个Facade,我担心编译时间,所以我只想在Facade的实现文件中包含库文件。

不,不是

真的,在这一点上,你只需要
#包括
。这并没有害处,因为您不能对
字符串有循环依赖关系:标准标题甚至不知道您的标题存在


无论如何,
std::string*
通常是错误的。

向前声明
std::string
可能看起来像这样:

namespace std
{
    template <class T, class Traits, class Allocator>
    class basic_string;

    template <class T>
    class char_traits;

    template <class T>
    class allocator;

    typedef basic_string<char, char_traits<char>, allocator<char> > string;
}
名称空间std
{
模板
类基本字符串;
模板
类特征;
模板
类分配器;
typedef基本字符串;
}

(这不会试图前向声明
basic\u string
具有默认模板参数。由于这些参数只能声明一次,我怀疑只有库作者可能有足够的控制权来完成。)



至于质疑std::string*
的用法,我想没有人会动态地分配它们。然而,想在别处引用其他字符串(或NULL)难道不是有效的吗?

名称空间std
中声明的内容(大部分)是未定义的。引用标准库对象、函数或类型的唯一合法方法是在包含相关头之后。17.4.3.1是这样说的。

许多编译器提供了一个
,它提供了一个向前工作的声明。我同意std::string*通常是错误的,但这只是一个最简单的工作示例。它也应该是有意义的,否则它不会真正显示任何东西。无论如何……好吧,我编辑了我的问题,添加了更多关于真实问题的信息。