C++ 为什么这个调用操作符有编译错误?

C++ 为什么这个调用操作符有编译错误?,c++,compiler-errors,operator-overloading,C++,Compiler Errors,Operator Overloading,在使用mingw32-g++编译时,出现了一个错误:调用“for_eachint[9],int*,main::Output”时没有匹配的函数,但在vs2005中可以做得很好吗 #include <iostream> #include <algorithm> int main() { struct Output { void operator () (int v) { std::cout << v << s

在使用mingw32-g++编译时,出现了一个错误:调用“for_eachint[9],int*,main::Output”时没有匹配的函数,但在vs2005中可以做得很好吗

#include <iostream>
#include <algorithm>

int main() {

  struct Output {
      void  operator () (int v) {
           std::cout << v << std::endl; 
       }
  };

  int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  std::for_each(a, a + sizeof(a)/sizeof(a[0]), Output());

  return 0;
}

您必须在main之外声明结构。有关说明,请参阅。

必须在main之外声明结构。请参阅以获取解释。

在C++11之前的版本中,用作模板参数的语言类型必须具有链接。C++中的本地类声明没有链接,这就是为什么它们不能被用作C++ 98/C++ 03中的模板参数的原因。在这些版本的语言中,您必须在名称空间范围中声明类


在C++11中删除了链接要求。从C++11的角度来看,您的代码是有效的。显然,您是在C++11之前的模式下编译的。

在C++11之前的版本中,用作模板参数的语言类型必须具有链接。C++中的本地类声明没有链接,这就是为什么它们不能被用作C++ 98/C++ 03中的模板参数的原因。在这些版本的语言中,您必须在名称空间范围中声明类


在C++11中删除了链接要求。从C++11的角度来看,您的代码是有效的。显然,您是在C++11之前的模式下编译的。

@kain64b-我无法理解此代码。。。有人能再描述一下吗…这是呼叫接线员超载我有点想知道为什么main在没有明显错误后返回1。chris,谢谢你的细心@kain64b-我无法理解此代码。。。有人能再描述一下吗…这是呼叫接线员超载我有点想知道为什么main在没有明显错误后返回1。chris,谢谢你的细心!除非您碰巧有一个C++11兼容编译器或一个不知道规则的编译器-VS2005。@Flexo:为什么会有问题?参数推断机制将使每个_按值接收其最后一个参数。没问题。除非你碰巧有一个C++11兼容编译器或者一个不知道规则的编译器-VS2005。@Flexo:为什么会有问题?参数推断机制将使每个_按值接收其最后一个参数。没问题。