【问题标题】:'template with C linkage' error when using template keyword in main.cpp在 main.cpp 中使用模板关键字时出现“带有 C 链接的模板”错误
【发布时间】:2020-05-10 19:44:38
【问题描述】:

在我的 main.cpp 中,我创建了多个自定义类的对象,例如:

#include "device_manager.hpp"
DeviceManager deviceManager; //compiles and works just fine

但是,当我尝试在同一个 main.cpp 中实现一个简单的模板时:

template <typename T>
inline T max(T a, T b) {
    return a > b ? a : b;
}

我明白了:

template with C linkage main.cpp line 35    C/C++ Problem

似乎编译器无法理解 template 关键字。我没有在 main.cpp 中添加任何 extern "C" 块。我尝试使用 gnu++14 编译器(C++14 + gnu 扩展)和 gnu++11 来编译我的 C++ 代码和 gnu11 来编译我的 C-to-C++ 转换项目中的 C 代码。理解 template 关键字可能会出现什么问题?

编辑: 该项目是作为 C 项目生成的,后来我使用 IDE 工具将其转换为 C++ 项目,还将 main.c 更改为 main.cpp。从那时起,我可以毫无问题地在 main.cpp 中声明我的类对象,但是当我尝试在 main.cpp 中使用 template 关键字时,我收到上述错误,就好像它在 extern "C " 声明(但我没有把它放在那里)。

C编译器命令:arm-atollic-eabi-gcc -c,编译器:gnu11

C++编译命令:arm-atollic-eabi-g++ -c,编译器:gnu++14

链接器命令:arm-atollic-eabi-g++ (我在 ARM 嵌入式系统上,用 Atollic TrueStudio IDE 编写)

【问题讨论】:

  • 这是 C++ 而不是 C。我删除了无关标签。
  • @jwdonahue 问题提到 C 代码和 C++ 都是编译的,显然问题是链接器/编译器将 C++ 处理为 C。你确定标签是无关的吗?
  • 请编辑您的问题以提供minimal reproducible example。你可能还想展示你是如何编译/链接的。
  • 问题已编辑。我很乐意就我的问题回答更详细的问题

标签: c++ templates g++ linkage


【解决方案1】:

“C 链接”部分让我怀疑您可能不会关闭

extern "C" {
//...
}

头文件中的声明。

这正是这样的代码会产生的错误:

extern "C" {
template <typename T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
}

【讨论】:

  • 我知道这一点,但正如我所写,检查了所有可能的 extern "C" 块,但事实并非如此。尽管如此,在 main.cpp 中仅在上面一行声明类对象对我来说效果很好
  • 拜托,帮我一个忙,并删除该标题;如果模板在没有它的情况下编译正常,则必须在该标头中遗漏某些内容(或在它包含的任何标头中传递)。
  • 这可能是 extern "C" 在 main.h 包含的文件中丢失的情况,刚刚开始跟踪它
  • 这显然解决了这个问题。在库(是)包含的文件中有一个 extern "C" { 块没有用 } 关闭。小心你包含的库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多