无法在 C++ 20 中同时导入 sstream 和 iostream?

Can't import both sstream and iostream in C++20?

提问人:Todd Burch 提问时间:4/26/2023 最后编辑:Remy LebeauTodd Burch 更新时间:5/3/2023 访问量:439

问:

在 Visual Studio 2022 中创建新的空 C++ Windows 控制台应用程序。

添加一个“main.cppm”文件,并用以下命令填充它:

import <sstream>;

int main()
{
    std::stringstream ss;
    ss << "Hey world!";
    return 0;
}

它应该编译并运行良好(尽管它没有做任何有用的事情)。

现在将其注释掉并将代码更改为:

//import <sstream>;
import <iostream>;

int main()
{
    std::cout << "Hello world!" << std::endl;
    //std::stringstream ss;
    //ss << "Hey world!";
    return 0;
}

同样,它编译并运行良好,我们在控制台上看到“Hello world!

但现在取消注释行:

import <sstream>;
import <iostream>;

int main()
{
    std::cout << "Hello world!" << std::endl;
    std::stringstream ss;
    ss << "Hey world!";
    return 0;
}

这将不会编译,并给出以下错误:

不允许 E0070 不完整类型

(指stringstream)

E0349 没有运算符“<<”与这些操作数匹配

不允许 E3365 不完整的类类型“std::basic_stringstream<char、std::char_traits<char>、std::allocator<char>>”

以及以下消息:

局部变量未初始化

(指变量)ss

如果我:

  1. #include <sstream>和 ,或import <iostream>;
  2. #include <iostream>和 ,或import <sstream>;
  3. #include <iostream>和。#include <sstream>;

但我不能同时。import <iostream>;import <sstream>;

谁能解释为什么,或者知道如何导入两者?我怀疑这与两者之间的依赖关系有关,但我不确定。

C++ C++20 IOstream Sstream

评论

4赞 Hans Passant 4/26/2023
Exxxx 诊断不是编译错误,只是从 Intellisense 分析器中喷出。这是非常新的,所以容易遇到麻烦,使用帮助>发送反馈提交错误报告。
2赞 David C. Rankin 4/26/2023
为什么,只是从标题开始?import#include
1赞 Todd Burch 4/26/2023
@DavidC.Rankin 当你的项目开始变大时,使用标头时编译时间会变得非常慢(而且效率非常低)。C++20 模块旨在解决这个问题(以及其他一些问题)。
1赞 HolyBlackCat 4/26/2023
我会再避免使用一两年的模块,特别是如果你是C++的新手。它们尚未得到广泛/适当的支持。如果生成时间有问题,请确保使用的是 PCH。
2赞 Nicol Bolas 4/26/2023
@ToddBurch:将标准库组件导入为标头单元应该可以工作,但在大多数实现中效果不佳。

答:

0赞 vitaut 5/2/2023 #1

这显然是 Visual Studio(特别是 IntelliSense)中的一个 bug。请注意,那里的模块支持仍然不完整,因此在修复之前,您必须使用包含。在 C++23 中,您还可以执行 .import std

评论

0赞 Fulgen 5/2/2023
不,不是,不是提供的信息。以 E 开头的诊断不是来自 MSVC(以 C 开头的诊断),而是来自 IntelliSense,这是 IDE 功能,而不是 C++ 编译器。
1赞 Bob__ 5/2/2023
@Fulgen 请注意,旧的首字母缩略词 MSVC 通常(尽管可能不精确)用于引用整个 Visual Studio IDE(包括 IntelliSense),而不仅仅是编译器,如果你对此答案感到担忧的话。cl.exe
0赞 HolyBlackCat 5/2/2023
@Bob__嗯,我的印象也是指编译器。例如,请参阅此
0赞 vitaut 5/2/2023
阐明了 MSVC 指的是 VS,而不是编译器。
0赞 apardoe 5/2/2023
MSVC 通常是指 Microsoft Visual C++ 工具集:源编译器。例如,请参阅使用首字母缩略词的此页面。Visual Studio 有多个 C++ 编译器有点令人困惑:IDE(例如 IntelliSense)使用不同的 C++ 编译器。使用“MSVC”来指代专门出现在 IDE 中的 bug 会令人困惑。
1赞 pascal754 5/2/2023 #2

我使用 MSVC 2022 版本 17.5.4 和 17.6.0 预览版 5.0。

编辑:IDE表示,C++ IntelliSense对C++20模块的支持目前处于实验阶段。

代码编译并运行。

Scan Sources for Module Dependencies需要为“是”。

您可以按如下方式更改此选项:

菜单 -> 项目 -> 属性 -> 配置属性 -> C/C++ -> 所有选项 -> -> 是。Scan Sources for Module Dependencies

Scan Sources for Module Dependencies