【问题标题】:Windows Linux c++ compiling issue: "no matching function for call"Windows Linux c++ 编译问题:“调用没有匹配的函数”
【发布时间】:2014-03-24 22:52:46
【问题描述】:

我正在开发一种工具,该工具提供了一种在它提供的框架内编写小型 c++ 代码的工具。该工具是基于windows和linux的。我们将代码写入窗口。出于测试目的,首先在 Windows 上进行编译。最后执行 linux 构建以在 linux 上实际运行整个生产测试。

我创建了一个具有以下签名的函数:

string myClass::myFunc(string& start, bool myflag, Class C1 & c1,
    long a=0, const char* b=NULL, void * c=NULL);

现在,当该工具在 Windows(Microsoft Visual Express)上运行时,一切正常并且所有测试都通过了。

但是,当代码在 linux 上编译时,我收到一条错误消息,指出“没有匹配的调用函数”。

这是函数签名:

string myClass::myFunc(string& start, bool myflag, Class C1 & c1,
    long a=0, const char* b=NULL, void * c=NULL);

错误信息:

myfile.cpp: no matching function for call to 
myClass::myFunc(std::string, bool, classC1&, long int&, 
const char *&, void*&) 

myfile.h: note: candidates are: 
std::string myClass:myFunc(std::string&, bool&, classC1&, 
long int, const char*, void*)

我无权访问 linux 服务器。因此不能提及 linux 发行版或任何其他细节。

提前致谢。

  • ftp

【问题讨论】:

  • 注意到 myfile.h 注释有 bool 作为参考。这是为什么呢?
  • 是的,我也注意到了。也许该工具在 linux 和 windows 中生成的代码不同。不幸的是,我无法访问 linux 机器。因此无法确定。
  • 你在做的是不是“交叉编译”。只是维护一个可移植的代码库。
  • 同意。删除了不正确的标签。

标签: c++ linux compilation compiler-errors


【解决方案1】:

Microsoft 的 C++ 编译器错误地允许将非const 引用绑定到临时变量。他们现在不会修复这个错误,因为它会破坏现有的代码。但是正如您所发现的那样,该代码已经在符合标准的编译器上被破坏了。

看看你是否不能按值传递(对于小类型)或通过 const 引用(对于复制成本高的那些)。如果它是输出参数,则需要更改调用者以传递左值而不是临时值。

【讨论】:

  • @user500949:根据错误信息,您的第一个参数是std::string 类型的临时参数,与实际函数中的非常量引用不匹配。
  • @user500949:哇。我为你感到非常抱歉,试图在没有调试权限的情况下开发代码。不过,可能值得要求 g++,不难证明它的合理性,因为(1)它是免费的——让你使用 express 版本的人应该喜欢它,并且(2)你需要开发代码才能在 linux 上运行使用 g++ 的地方。 clang 也不是一个坏选择。但是拥有两个(或更多)不同的编译器是尽早发现可移植性问题的最佳方法。
  • @user500949:是的,像这样添加const 是正确的解决方法。只要实际上没有尝试更改参数(但是为什么它不是 const 呢?)
  • @user500949:我检查了您提供的错误消息并比较了两个签名。我知道可以删除&,或添加const&。但是只添加& 是不允许的。
  • 例如,在最后一个参数上,错误信息显示调用者有一个void*&,被调用的函数接受void*。没关系,将制作指针的副本。但是第一个参数,调用者有一个std::string(一个临时的),而函数想要一个std::string&
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 2021-09-21
  • 2016-11-23
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多