涉及iostream和wstring的奇怪的C++行为

Pet*_*riu 1 c++ iostream wstring

我有两个文件,my_program.cpp它的标题my_program.h.

my_program.cpp包含这个:

#include "my_program.h"
using namespace std;
Run Code Online (Sandbox Code Playgroud)

my_program.h包含指向返回a的函数的指针wstring,如下所示:

using namespace std;
typedef wstring (*my_function)(wstring, int, int, int, int);
Run Code Online (Sandbox Code Playgroud)

程序不会在这种状态下编译(在typedef处停止...说ISO C++禁止声明'wstring'没有类型),但如果我#include <iostream>之前#include "my_program.h"在.cpp文件中添加,程序会奇迹般地编译.

为什么会这样?我只是希望我没有犯下愚蠢的错误,现在我会被嘲笑.

Jer*_*fin 5

你真的应该包括<string>.

从事物的声音,你的编译器<iostream>碰巧包含<string>,所以它的工作原理,但在不同的编译器上它可能没有.C++允许标准头包含其他标准头,但不需要它.在某些情况下,你只得到一个类的声明,所以有些东西有效,有些则没有.

至少根据我的经验,这也是一个问题,可能会从一个版本的编译器转换到另一个版本,所以即使你不打算移植到其他任何版本,你的代码也可能因为看似微不足道而退出工作升级,除非您包含正确的标题.