Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C_C++ - Fatal编程技术网

为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C

为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C,c++,C++,为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C>是一个保留的标识符。只需更改该函数的名称,代码就可以工作。 登记器< /C>是C++的一个关键词。@重写,作为标识符,在特殊位置具有特殊含义,这样它就不会成为保留字。(我以前在自己的编译器fiddlings中使用过这个技巧,所以这对我来说并不

为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时?
#包括
#包括
#包括
结构可调用{
void运算符()(){

STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C>是一个保留的标识符。只需更改该函数的名称,代码就可以工作。

<代码>登记器< /C>是C++的一个关键词。@重写
,作为标识符,在特殊位置具有特殊含义,这样它就不会成为保留字。(我以前在自己的编译器fiddlings中使用过这个技巧,所以这对我来说并不完全是新的。)所以,我只半同意你…;-)@Scheff Fair,但是
override
是一个上下文关键字,所以它不那么重要。非上下文关键字要复杂得多。举一个非常不幸的例子,
yield
前面有一个
co
:(@Scheff用英语以外的另一种语言命名所有东西(例如像我这样的德语)是避免这种冲突的好方法。
register
会变成
registriere
,因此不会发生冲突。@nada抱歉,不会,永远不会。:-)我不喜欢这种混杂的东西。我不得不在每日广播新闻和广告中忍受这种情况,但我不想在我精心编写的源代码中看到它。实际上,clang给出了更多的提示(),但gcc喜欢在这里保持神秘……这确实是一个意外的根本原因……@magnize_prime_是_463035818哦,很好的观点。叮当声错误仍然是无用的,警告是因为
寄存器
被弃用:p将其更改为
无效
,例如,叮当声再次完全没有帮助。fwiw with
-std=C++17
Clangs警告是一个错误。使用gcc
-Werror-Wall
也不会让它变得更好。我想这是一个不会犯的错误often@largest_prime_is_463035818是的,没错。事实上,我对有人在这个问题上已经投错的简历感到不舒服。
#include <iostream>
#include <vector>
#include <functional>

struct Callable {
  void operator()() {
    std::cout << "hello world\n";
  }
};

std::vector<std::function<void()>> cbs;

void register(std::function<void()>&& cb) {  // <-- ERROR
  cbs.emplace_back(std::move(cb));
}

int main() {
  Callable c;
  register(std::bind(std::ref(c)));
  for (auto& cb : cbs) {
    cb();
  }

  return 0;
}