【问题标题】:No template named 'function'没有名为“函数”的模板
【发布时间】:2020-01-10 02:42:17
【问题描述】:

我正在尝试在 mac 上编译一个用 C++ 编写的代码,并且有一个函数

tuple<string, string, int> getURL(const string& url, const function<void(CURL*)>& opts)
{...}

有错误

      no template named 'function'
  ...int> getURL(const string& url, const funct...
                                          ^

我尝试修改函数标题。之后我可以编译该模块,但编译器无法与其他模块链接:

"getURL(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void (void*)> const&)", referenced from:
      CensysScanner::getHostInfo(Host*) in CensysScanner.cpp.o
      DebianLookup::FindVulnerability(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, OpSys, double) in DebianLookup.cpp.o
      DebianLookup::GetChangelog(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, OpSys, double) in DebianLookup.cpp.o
      EnterpriseLinuxLookup::FindVulnerability(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, OpSys, double) in EnterpriseLinuxLookup.cpp.o
      EnterpriseLinuxLookup::GetChangelog(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, OpSys, double) in EnterpriseLinuxLookup.cpp.o
      LooquerScanner::getHostInfo(Host*) in LooquerScanner.cpp.o
      ShodanScanner::getHostInfo(Host*) in ShodanScanner.cpp.o
      ...

我还包含了功能模块 (#include &lt;functional&gt;),我正在使用 std 命名空间 (using namespace std;)。

【问题讨论】:

  • 您可能无法为此创建minimal reproducible example,尽管这可能会很困难。好消息是,当你这样做时,你就会知道答案。
  • 你#include &lt;functional&gt;了吗?
  • 我已经包含了
  • @buduboti 您现在要问的是两个错误中的哪一个?编译错误还是链接器错误?你说你修改了代码,你是用什么方式修改的?

标签: c++ macos gcc g++


【解决方案1】:
"getURL(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void (void*)> const&)", referenced from:

其他对象文件引用的这个符号作为参数a std::__1::function。这是标准库中的std::function,您的第一个代码块中的function 显然应该引用它。

检查是否包含#include&lt;functional&gt;,是否使用C++11 或更高版本进行编译,并编写std::function 而不是function,或者检查是否有一个using 语句从std 导入function进入当前命名空间,例如using namespace std;using std::function;

【讨论】:

  • "...,在您的第一个代码块中似乎应该别名为 function" - 很可能 OP 在他们的代码
  • @RemyLebeau 用词不当,我指的是常识中的“别名”,而不是类型别名的语言特性中的别名。我会重写的。
  • 我已经编辑了我的问题:我正在使用 std 命名空间并且我已经包含了功能。
  • @buduboti 您是否检查了第三步,针对 C++11 或更高版本进行编译?如果是,那么请尝试提供更多信息,最好是minimal reproducible example。还要检查您正在使用的编译器(macos 上的 gcc/g++ 可能是 clang/clang++ 的符号链接),如果您正在谈论仍然存在链接器问题,请为两个目标文件提供来自 nm 输出的相关行从包含您的第一个块的代码生成,以及错误中提到的(其中一个)冲突目标文件的输出。如果您修改了第一个代码块,请同时显示修改后的版本。
  • @uneven_mark Makefile 是我的 cmake 生成的,-std=c++14 被设置为标志,现在我也尝试set (CMAKE_CXX_STANDARD 14) 代码不是我的,它是为 Windows 编写的,现在我正在尝试编译到mac。我已经解决了一些编译问题,但我无法解决这个问题。明天给作者发短信,希望他能帮到我。
【解决方案2】:

使用std::function 有效。我不知道为什么需要std::,因为在文件的顶部,命名空间被告知(using namespace std;),但它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2023-01-13
    • 2015-12-16
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多