4

我的标题:

#include <chrono>
#include <thread>
#include <iostream>
#include <string>
#include <fstream>
#include "include\curses.h"

我的代码问题:

        std::this_thread::sleep_for(std::chrono::milliseconds(500));

我的错误:

错误 C3083:“this_thread”:“::”左侧的符号必须是类型

这对我来说毫无意义!?添加所需的每个标题。Intellisense(我在 VS2012 上)检测引用和参数。它只是不会编译。

其他相关错误

*错误C2039:'sleep_for':不是'std'的成员*

*错误 C3861: 'sleep_for': 未找到标识符*

4

4 回答 4

5

我刚刚遇到了类似的问题 - VS Intellisense 的代码没有问题,但是我在构建时遇到了同样的错误,不仅在 VS 中,在 GCC 中也是如此。(不是 VS 错误

我遇到的一个大问题是2 个标题相互包含。本质上,因为一个文件包含另一个文件,但另一个文件依赖于第一个文件,您可能会遇到一些奇怪的行为。

毫无疑问,标题通常在顶部有#ifndef ,它包含标题的全部内容,因此它永远不能被包含超过一次。这至少使我们免于陷入无休止的包含循环,尽管我们仍然有问题。

当包含第二个时,它引用了第一个,但第一个已定义,因此第一个不会包含到第二个中,然后第二个标头中的代码将复制到包含它的第一个中。因为第二个标头包含在它需要的函数之上,所以您将收到关于未定义事物的错误,甚至是不存在的命名空间(因为直到将第二个标头插入第一个顶部之后才定义这些标头。)

这里有2个解决方案:

  1. 在我的例子中,因为我只依赖于具有单个小函数的第一个文件,所以我选择通过手动内联第二个文件中的代码来简单地删除一个依赖项。

  2. 您还应该能够将原型添加到您要使用的函数中,因此如果一个包含在另一个下面,您至少有一个原型告诉编译器“这将在稍后定义,相信我它存在。”

我发现发生了什么的方法是将问题标题移到包含列表中的所有其他标题之上,这揭示了更多错误,其中许多相似但现在困扰着另一个包含。

我不完全确定为什么using namespace对你有用,但我能想到的是这个 using 语句至少告诉编译器将名称视为命名空间而不是一些未定义的东西,因此关于你的命名空间不是类型的错误.

于 2014-02-18T08:59:26.673 回答
2

感谢@stefan 的评论,我可以解决这个问题。这可能是一个VISUAL STUDIO 2012 编译错误 我会提供一个简短版本的答案以保持事情干净,但我必须补充一点,这#include "include\curses.h"不是问题(尽管我会遵循​​乔纳森关于 / 的提示;-))

必需的标题:

#include <chrono>
#include <thread>

必需的命名空间(它不会仅std::this_thread::sleep_for()在 VS2012 上编译:

using std::this_thread;

固定代码行:

sleep_for(std::chrono::milliseconds(500));

额外说明在 Linux 上 使用 g++ 编译器(带-std=C++11选项)不会出现此问题。即您可以简单地使用:

std::this_thread::sleep_for(std::chrono::miliseconds(500));

using std::this_thread声明

如果其他人可以进一步解释这一点(在 VS2012 上),请添加评论!

于 2013-05-07T00:27:00.187 回答
1

为了避免其他人不得不深入研究他们的代码,想知道为什么编译器会产生类似的错误:

确保您包含的所有标头都正确关闭了它们的命名空间范围。


例子:

abc.h

namespace abc
{
    int foo();
// oops, you forgot to close that scope

abc.cpp

#include "abc.h"
namespace abc
{
  int foo() { /* ... */ } // This now implements ::abc::abc::foo()
}
于 2017-11-13T14:27:11.493 回答
0

我在 Vc2017 中有一个完全相同的错误。

就我而言,对 std::this_thread 的调用位于头文件的类成员函数中。

只需将我的违规功能的实现移动到 .cpp 文件即可解决问题。

于 2019-02-12T07:53:47.417 回答