尽管存在显式实例化,但类模板的成员函数模板找不到定义。不链接

2023-12-12

Edit:这不是链接问题的重复,因为我使用的是显式实例化,并且只有特定类型的成员函数不链接(其他函数会链接)。

以下代码可以编译但无法链接,我不明白为什么。 它显式实例化Vector类来限制可能的参数数量T因此隐藏了定义Vector<T>在 .cpp 文件中。

// fwd_decl.hpp
#pragma once
template<typename T>
struct Vector; // Forward declare Vector to be used in other headers

// Vector.hpp
#pragma once
#include "fwd_decl.hpp"

template<typename T>
struct Vector
{
    template<typename U> // To allow for other types than T to be used
    Vector operator+(const Vector<U> & other) const;
    T x;
    T y;

    // more stuff..
};

// Vector.cpp
#include "Vector.hpp"
template<typename T>
template<typename U>
Vector<T> Vector<T>::operator+(const Vector<U> & other) const
{
    return { static_cast<T>(x + other.x), static_cast<T>(y + other.y) };
}
template struct Vector<int>; // Explicitly instantiate Vector<T> with int

// main.cpp
#include "Vector.hpp"
int main()
{
    Vector<int> b = Vector<int>{ 2, 3 } + Vector<int>{ 4, 5 };
}

我收到的错误是:

1>main.obj : error LNK2001: unresolved external symbol "public: struct Vector<int> __thiscall Vector<int>::operator+<int>(struct Vector<int> const &)const " (??$?HH@?$Vector@H@@QBE?AU0@ABU0@@Z)

我正在编译VC++ 17 in VS 15.9.4.

请注意,呼叫成员Vector<int>那些不是函数模板的链接可以正常链接。


您应该使用该方法的显式实例化template<typename T> template<typename U> Vector<T> Vector<T>::operator+(const Vector<U> & other) const(对于所有可能的对T and U)除了显式实例化Vector<T> class:

template Vector<int> Vector<int>::operator+(const Vector<short> & other) const;

您也可以简单地移动Vector<T>::operator+方法到头文件中。

在 C++11 中extern template指令被引入。您可以在头文件中使用它Vector<T>类(如@说故事的人 评论中建议):

extern template struct Vector<int>;

...防止编译器实例化Vector<T>每个翻译单元中都使用其专业化的类。当然一样extern template指令也可用于所有Vector<T>::operator+明确实例化的专业化.cpp file.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管存在显式实例化,但类模板的成员函数模板找不到定义。不链接 的相关文章

随机推荐

  • NASM 在 .text 部分声明变量

    我刚刚开始使用 nasm 学习 asm 我注意到如果我在 text 部分声明一个变量 我的代码工作得很好 只是想知道为什么我可以这样做以及它与使用 data 部分有何不同 我还注意到在 bss 部分中的变量名称后面需要一个 但在 data
  • BIRT 变量 - 如何创建和使用?

    我需要创建一个全局报告变量来获取第一个表的变量 然后在最后一个表中使用它来进行计算 我是 BIRT 新手 没有找到相关指南 有人可以解释我该怎么做吗 我们在大纲视图的 变量 部分初始化一个全局报告变量 然后我们可以从报告的任何位置设置和获取
  • 网页更新无需轮询

    我正在开发一个网络应用程序 用户可以在其中请求服务 并且提供商将可以响应他 因此 当用户请求某种服务时 我们的应用程序将向提供商发送通知 要求他响应用户 我想做的是 当用户请求服务时 提供商会立即收到通知 就像 Facebook 那样 实现
  • 按外键求和分组

    我需要对表 B 中的数量进行求和 并根据创建日期时间的 id 进行分组 并与表 A 的 id 连接 CREATE TABLE TableA Id int Name varchar 50 Type varchar 10 ForeignKeyI
  • 未定义的符号:clapack_sgesv

    我有这个小代码 from numpy import from scipy import signal misc import matplotlib pyplot as plt path pics band 1 misc imread pat
  • 基于 Woocommerce 中的用户角色和付款方式的百分比折扣

    我试图为functions php 编写一个代码片段 当同时选择角色 订阅者 和付款方式 信用卡 时 该代码片段会对购物车总额应用2 的折扣 到目前为止我的进展 function discount when role and payment
  • 从 HTML 中抓取 pdf 文件

    如何从 HTML 中抓取 pdf 文档 我正在使用 R 只能从 HTML 中提取文本 我要抓取的网站示例如下 https www bot or th English MonetaryPolicy Northern EconomicRepor
  • Internet Explorer 中的 element.dataset

    我需要一种方法来列出data 元素的属性 我会用Object keys element dataset 但IE 9 0没有dataset支持 我应该如何以适用于 IE 9 0 以及 Chrome Firefox Safari 的方式执行此操
  • 将随机数添加到脚本标签

    我想向动态构造的脚本标记添加一个随机数 下面的代码不会向生成的脚本标签添加任何随机数 有人知道如何添加随机数吗 var wss document createElement script wss nonce random string ws
  • ClearCase SCM 适配器支持注释

    我想用版本历史注释一些代码 当使用 SVN 时 这在 Eclipse 中很容易 但 Rational ClearCase SCM Adapter 插件似乎不支持它 我快速 Google 搜索显示 ClearCase 在命令行上支持通过以下方
  • Node.js - 如何检查 http 请求中 URL 的状态

    我正在尝试运行一个简单的应用程序 使用 http 服务器模块检查 URL 的状态 基本上这是一个简单的 http 服务器 require http createServer function req res res writeHead 20
  • Perl 中的 chomp 未按预期工作

    我在 Perl 中发现了 chomp 的奇怪行为 我无法理解为什么 chomp 会这样工作 以下行无法按预期工作 if chomp str1 eq chomp str2 但是 以下工作正常 chomp str1 chomp str2 if
  • Quartz.NET 3.0 似乎在同一范围内启动所有作业

    在定义了两个依赖于作用域服务 ScopedDataAccess 的作业 该服务是我的数据库上下文的包装器 之后 我很难将 Quartz 3 0 7 与 ASP NET Core 2 2 一起使用 services AddScoped
  • Ionic 2 无法解析 InAppBrowser 的所有参数

    我不明白为什么在使用本机 InAppBrowser 插件时出现以下错误 无法解析 InAppBrowser 的所有参数 import Component from angular core import NavController NavP
  • 如何添加提交表单的 5 分钟 JavaScript 倒计时器

    我想添加 5 分钟倒计时器 将表单提交到我的 php 页面
  • 从c++ xll返回二维数组到excel,回来

    首先我知道这个问题已经在这里被问过 从 c xll 返回多维数组到 excel 我曾试图重提这个话题 但没有成功 OP 最近不那么活跃 从来没有 这就是为什么我再次问这个问题 提前抱歉 我编写了一个返回 行 一维数组的函数 declspec
  • 这个 Pascal 语法有什么问题?

    我不明白这是怎么回事 你能帮我个忙吗 这是有问题的代码 While not EOF Archi do begin index index 1 Read Archi Alumno index Promes index Alumno index
  • python 中的 urllib2 相当于 ruby

    我在 python 中有一些代码 可以在 python 中发送 http 请求 但我试图弄清楚如何在 ruby 中执行此操作 因为我的服务器是 Rails import urllib2 sys json url http new openb
  • 将本地文件推送到 github 存储库中的目录

    我的本地存储库中有一个文件 我想将其推送到我的 Github 存储库中的目录 我有以下文件 F Development Python Workspace StringCalculator py 我需要将此文件推送到我的存储库的以下路径 ht
  • 尽管存在显式实例化,但类模板的成员函数模板找不到定义。不链接

    Edit 这不是链接问题的重复 因为我使用的是显式实例化 并且只有特定类型的成员函数不链接 其他函数会链接 以下代码可以编译但无法链接 我不明白为什么 它显式实例化Vector类来限制可能的参数数量T因此隐藏了定义Vector