C++ C++&引用;错误:没有名为‘;类型’;在‘;类std::结果\u的<&燃气轮机&引用;

C++ C++&引用;错误:没有名为‘;类型’;在‘;类std::结果\u的<&燃气轮机&引用;,c++,c++11,g++,grpc,C++,C++11,G++,Grpc,我正在尝试编译gRPC服务器,但出现错误: In file included from /usr/include/c++/4.8.2/mutex:42:0, from /usr/include/c++/4.8.2/condition_variable:39, from /home/msl/maum/include/grpc++/server.h:22, from wavenet_server.c

我正在尝试编译gRPC服务器,但出现错误:

In file included from /usr/include/c++/4.8.2/mutex:42:0,
                 from /usr/include/c++/4.8.2/condition_variable:39,
                 from /home/msl/maum/include/grpc++/server.h:22,
                 from wavenet_server.cc:2:
/usr/include/c++/4.8.2/functional: In instantiation of ‘struct std::_Bind_simple<std::_Mem_fn<void* (WavenetServiceImpl::*)(void*)>(void**)>’:
/usr/include/c++/4.8.2/thread:137:47:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void* (WavenetServiceImpl::*)(void*); _Args = {void* (&)[2]}]’
wavenet_server.cc:317:73:   required from here
/usr/include/c++/4.8.2/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void* (WavenetServiceImpl::*)(void*)>(void**)>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c++/4.8.2/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void* (WavenetServiceImpl::*)(void*)>(void**)>’
         _M_invoke(_Index_tuple<_Indices...>)
在/usr/include/c++/4.8.2/mutex:42:0中包含的文件中,
从/usr/include/c++/4.8.2/condition_变量:39,
from/home/msl/maum/include/grpc++/server.h:22,
从wavenet_server.cc:2:
/usr/include/c++/4.8.2/functional:在“struct std:_Bind_simple”的实例化中:
/usr/include/c++/4.8.2/thread:137:47:std::thread::thread(_Callable&&,_Args&&&…[with _Callable=void*(WavenetServiceImpl::*)(void*);_Args={void*(&)[2]}中的必填项
wavenet_服务器。cc:317:73:此处为必填项
/usr/include/c++/4.8.2/functional:1697:61:错误:在'class std::result_of'中没有名为'type'的类型
typedef typename result_of::type result_type;
^
/usr/include/c++/4.8.2/functional:1727:9:错误:在'class std::result_of'中没有名为'type'的类型
_M_invoke(_Index_tuple)
我猜是wavenet_server.cc中的这一行:

std::thread t(&wavenetserviceinpl::threadWavenetInfer,thread_参数)

正在引入歧义(编译器可能不知道这是一个函数消隐还是一个表达式?)

因此,我尝试用以下内容替换该行:

std::threadt{&wavenetserviceinpl::threadWavenetInfer,thread_args}

但这也不起作用


这是问题的正确根源吗?我该怎么修呢?如果那一行不是问题所在,那么请告诉我(源代码太长,无法粘贴,我无法判断哪一行是问题所在,因为我无法理解错误消息,但我会尽力)。

如果您想使用C++11功能,如
std::result\u of
,则需要更新的GCC版本。GCC4.8只有非常实验性的C++11支持。通常建议仅在C++98模式下使用它

如果您想在Red Hat Enterprise Linux 7上使用C++11,您应该获得最新版本的Red Hat Developer工具集:

对于CentOS


请记住,由于DTS的工作方式,您需要使用DTS编译所有C++11代码,因此您不能使用预编译的gRPC库。

什么是
WavenetServiceImpl::threadWavenetInfer
thread\u args
?你确定前者可以与后者一起调用吗(如果它是类方法,请记住它需要
this
ptr,使用lambdas可能会更幸运)。@DanM。前者是类函数,后者是void**。您认为这可能是个问题吗?成员函数的第一个参数是隐式的
this
。查看并检查它是否有帮助。你的问题没有更明确的答案。你的编译器是从哪里来的?您的发行版是什么?我使用的是:g++(GCC)4.8.5 20150623(Red Hat 4.8.5-28),在编译时,我提供了-std=c++11标志。你建议我更新我的GCC吗?我害怕使用c++98,因为在谷歌提供的gRPC演示中,他们使用了c++11。另外,我有一个用c++11编译的cuda设备代码。您可以使用DTS。我添加了一些链接。谢谢!我将尝试从第二个链接下载它。但是,我使用的是我公司的服务器,所以我不能更新任何默认编译器或更改环境变量。有没有办法保留所有默认设置和旧编译器,并且在显式设置环境变量时只使用最新版本?是的,DTS就是这样工作的。在您使用
scl enable devtoolset-7
之前,一切都保持原样,然后新的
g++
命令仅为您运行的程序激活。