std::thread错误(std没有成员线程)

34
我使用MacPorts编译并安装了gcc4.4。
当我尝试使用命令“g++ -g -Wall -ansi -pthread -std=c++0x main.cpp”进行编译时...
 #include <thread>
 ...
  std::thread t(handle);
  t.join();
 ....

编译器返回:
 cserver.cpp: In member function 'int CServer::run()':
 cserver.cpp:48: error: 'thread' is not a member of 'std'
 cserver.cpp:48: error: expected ';' before 't'
 cserver.cpp:49: error: 't' was not declared in this scope

但是std::cout <<...可以正常编译。

有人能帮我吗?


如果您查看线程头文件,似乎该类仅存在于#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)。但我不确定,您需要做些什么才能定义它们。 - UncleBens
@UncleBens:我相信这些是由-pthread和-std=c++0x直接定义的。省略-pthread会导致段错误:http://gcc.gnu.org/ml/gcc-help/2009-04/msg00208.html - Artem Sokolov
最新更新:MacPorts的gcc 4.7.0支持/编译std :: thread,而4.6.3则不支持。 - P Marecki
4个回答

15

gcc目前还不完全支持std::thread:

http://gcc.gnu.org/projects/cxx0x.html

http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html

在此期间请使用boost::thread

编辑

虽然下面的代码在我使用的gcc 4.4.3上编译和运行正常:

#include <thread>
#include <iostream>

struct F
{
  void operator() () const
  {
    std::cout<<"Printing from another thread"<<std::endl;
  }
};

int main()
{
  F f;
  std::thread t(f);
  t.join();

  return 0;
}

编译命令:

g++ -Wall -g -std=c++0x -pthread main.cpp

a.out的输出结果:

来自另一个线程的打印

你能提供完整的代码吗?也许这些...中隐藏着一些模糊的问题?


我尝试了你的代码,但是出现了相同的错误......这可能与OSX有关吗?或者MacPorts安装的GCC存在问题? - luis
1
可能是MacPorts不完全支持c++0x功能?你有gcc配置脚本的输出吗?这里有一个Mac用户,他的配置指定std::thread不受支持:(http://www.mail-archive.com/dealii@dealii.org/msg00973.html) - Artem Sokolov

7

我在Windows上使用MinGW时遇到了相同的问题。我在github上找到了in的包装类 mingw-std-threads,将mingw.mutex.h和mingw.thread.h文件添加到全局MinGW目录中解决了这个问题。我所要做的就是包含头文件,我的代码保持不变。

#include "mingw.thread.h"

...
std::thread t(handle);
...

1
谢谢你。这个问题让我疯狂了。你的回答有点让人困惑,因为你提到了全局MinGW目录。我不得不把文件放在项目文件夹中,以使它正常工作......但是它确实起作用了。 - CoreyRS
1
你说的全局目录是什么意思?我试图找到插入它的位置,尝试了与/bin /include同级的全局位置,但不起作用。先谢谢你。 - Gerasimos Ragavanis

6

去掉-ansi选项,这意味着使用-std=c++98,显然你不想这样。它还会定义宏__STRICT_ANSI__,这可能会改变头文件的行为,例如禁用C++0x支持。


宏名称实际上在末尾有两个下划线,但如果我正确书写,SO会将其误解为格式化。 - Tronic
指出得很好,我已经将其删除,但仍然出现相同的错误...我尝试使用gcc4.4和gcc4.5 beta...这真让人沮丧。 - luis
修复了缺少下划线的问题。 - deft_code

0
更新您的MinGW编译器到最新版本,可以使用MSYS2来解决此错误,或者尝试使用MSYS2重新安装MinGW。
cserver.cpp:48: error: 'thread' is not a member of 'std'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接