函数模板和友元重载运算符报"无法解析的外部符"的解决方法

类模板中使用重载输出运算符<< VS2019编译器提示无法解析的外部命令 类模板中使用重载输出运算符<< VS2019编译器提示无法解析的外部命令   在模板类, 使用重载运算符的时候,编译器无法通过编译   后来问了群里大牛, 才知道是C++开发者挖的一个坑, 只要在代码里添加<>就完美解决   代码: #pragma once #include <iostream> using namespace std; //Vector容器类 template <typename T> class Vec 阅读详情

解决方法:

1. 直接把定义和实现都写在类中
2. 如下:

    #include <iostream>
    using namespace std;


    template <class T>
    class Compleax
    {

        template <class S> //注意这里是S,和上面的T的名字不一样
        friend ostream & operator<< (ostream &out, Compleax <S>&c);
        public:
        Compleax(T a, T b);
        void PrintCom()
        {
            cout<<"a:"<<a<<" b:"<<b<<endl;
        }
        private:
        T a;
        T b;
    };

    template <class T>
    Compleax<T> :: Compleax(T a, T b)
    {
        this->a = a;
        this->b = b;
    }

    template <class T>
    ostream &operator << (ostream &out, Compleax<T> &c)
    {
        out<<c.a<<" "<<c.b<<endl;
        return out;
    }
    int main()
    {
        Compleax<int> c(2, 3);
        c.PrintCom();
        cout<<c<<endl;
        return 0;
    }

3. 如下:

    #include <iostream>
    using namespace std;


    //1.需要先声明类模板
    template <class T>
    class Compleax;

    //2.再声明友元函数
    template <class T>
    ostream & operator<< (ostream &out, Compleax<T> &c);

    template <class T>
    class Compleax
    {
    //3.类中定义友元函数,注意需要加上<>
        friend ostream & operator<< <T>(ostream &out, Compleax &c);
        public:
        Compleax(T a, T b);
        void PrintCom()
        {
            cout<<"a:"<<a<<" b:"<<b<<endl;
        }
        private:
        T a;
        T b;
    };

    template <class T>
    Compleax<T> :: Compleax(T a, T b)
    {
        this->a = a;
        this->b = b;
    }

    template <class T>
    ostream &operator << (ostream &out, Compleax<T> &c)
    {
        out<<c.a<<" "<<c.b<<endl;
        return out;
    }
    int main()
    {
        Compleax<int> c(2, 3);
        c.PrintCom();
        cout<<c<<endl;
        return 0;
    }

这样即可解决错误提示为无法解析的外部符之类的问题。下面来说明一下为什么会有这样的现象发生。

其实在模板机制的内部,编译器做的工作和没有模板机制时我们做的功能大同小异。在使用了函数模板的代码中。编译器其实进行了二次编译,第一次是在声明函数模板时,会检查你的函数模板的语法有没有错误,然后编译你的函数头,之后代码中使用模板时,就会把函数模板的代码根据变量类型来编译后并实例化,完成二次编译。

出现这种问题的原因就是,两次编译的函数头不一样,因为友元函数并不属于类的成员函数,所以需要单独声明此友元函数是函数模板,如果没有声明,但是后面在实现的时候又使用了template <class T>,就会导致错误的发生。所以需要额外使用template <class S>声明。

加上<T>的目的是告诉编译器当前函数需要使用函数模板并且参数类型使用当前模板类的参数类型。

C++模板类中声明友元函数重载输入和输出运算符时,提示无法解析的外部符号解决方案 在练习模板类的重载输入输出运算符时,编译器提示“无法解析的外部符号”,代码如下:template <typename T> class matrix { friend ostream& operator<<(ostream &out, const matrix<T> &m); friend istream& operator>>(sstream &in, matrix<T> &m); 阅读详情

相关推荐

面板数据门槛归回分析,xthreg的安装,xthreg2安装包

我用的是Stata17,数据是不平衡的面板数据,需要用到xthreg2,虽然我找到了xthreg2.ado,但是还需要安装xthreg,因为运行xthreg2需要xthreg包顺带安装的lxthreg.mlib文件。但是!我后来发现还是不行,最后是去买了一个真正能用到xthreg2的lxthreg.mlib文件,才可以运行。

weixin_55252589的博客 1万+

有关C++模板(template)的编译错误“error LNK2019: 无法解析的外部符号”的分析

按照通常的习惯,我们这样设计一个类或者结构(体): 在头文件(*.h *.hh *.hpp *.hxx)中声明成员(或属性)和方法(假设为MyClass.hpp), 在源文件(*.c *.cc *.cpp *.cxx)中包含该头文件(#include "MyClass.hpp")并实现类 或者结构(体)的方法 然后在调用方(比如main.c...

akzc42847的博客 1071

【数据分析与挖掘实战】金融风控之贷款违约预测详解1(有代码和数据集)

金融风控一.题目理解1.1.题目概况1.2数据概况1.3预测指标二.数据来源三.查看数据四.分类指标计算示例4.1混淆矩阵4.2准确度4.3precision(精确度),recall(召回率),f1-score4.4P-R曲线4.5ROC曲线4.6AUC曲线4.7KS值五.数据分析5.1基本信息5.2查看数据集中特征缺失值,唯一值等5.3查看特征的数值类型有哪些,对象类型有哪些5.3.1数值连续型变量分析5.3.2非数值类别型变量分析5.3.3总结:5.4变量分布可视化5.4.1单一变量分布可视化 更新中~

m0_49263811的博客 1万+

【c++】因模板类导致的 LNK2019 错误:“ 无法解析的外部符号 ” 详解

最近在做项目的时候用到了模板类 果不其然出现了那个错误 LNK2019:无法解析的外部符号 网上百度到的结果繁花怒放,大多数不符合我的需求,故自己研究了下C++的模板类规则,试图找出问题所在 ————————————下面是解决方法—————————————— 首先将出现这个错误应该怎么处理的方法写出来,解一些急着知道结果的攻城狮们燃眉之急: 1.在主函数包含头文件时将实现模板类的函...

师兄怎么办 2万+

基于Halcon与C#的PCB焊接缺陷智能检测系统开发实战(附完整源码与项目文档)

本文详细介绍了基于Halcon与C#的PCB焊接缺陷智能检测系统开发实战,涵盖机器视觉技术、硬件选型、图像处理算法及C#上位机开发。通过实战案例展示如何实现高效、准确的PCB焊接缺陷检测,提升生产效率与质量,并附完整源码与项目文档。

mango的博客 218

31、MSP430FR2355时钟系统与低功耗模式解析

本文详细解析了MSP430FR2355的时钟系统和低功耗模式。首先介绍了时钟系统的组成,包括XT1振荡器、DCO、MODCLK、MCLK、SMCLK和ACLK的功能与配置方法。接着探讨了MSP430FR2355的五种低功耗模式及其配置要点,并分析了时钟系统与低功耗模式之间的协同关系。最后通过实际应用案例展示了如何在具体场景中优化系统功耗。文章旨在帮助开发者充分利用MSP430FR2355的时钟与低功耗特性,实现高性能、低功耗的嵌入式系统设计。

mars5的博客 195

c++笔记——概述运算符重载——解析运算符重载的难点

c++运算符重载知识点

strive_mianyang的博客 2358

【Flink】FLink session yarn kerberos认证报错 PortUnreachableException: ICMP Port Unreachable

本篇博客是在上一篇博客:【Flink】FLink session yarn kerberos认证报错 KrbException: Cannot locate default realm还没找到原因的时候做的一次尝试。因为项目需要,我们需要对接华为认证的yarn集群,运行flink任务,我们的任务分为两种,yarn pre-job模式和flink session模式。我们在配置文件中配置如下# kerberos认证需要的东西提交任务的脚本如下。

九师兄 1267

C++核心进阶:友元、拷贝控制、运算符重载与模板实战解析

面向对象编程中的封装机制通过访问控制保护数据,但特定场景下需要打破封装边界,这时友元机制提供了精确的访问授权。理解对象生命周期管理离不开拷贝控制,深拷贝与浅拷贝的区别直接关系到内存安全与程序稳定性。运算符重载技术允许自定义类型像内置类型一样工作,提升代码可读性和直观性。泛型编程通过模板实现类型无关的代码复用,是构建通用库和容器的基石。本文以C++工程实践为背景,深入探讨友元机制的双刃剑效应、拷贝构造与赋值运算符的陷阱、以及模板在构建健壮类设计中的综合应用,帮助开发者编写可靠而高效的C++代码。

weixin_31960565的博客 296

微信小程序 - 解决video视频播放黑屏只有声音没有画面问题,使用Video标签无法播放视频失败只有声音、黑屏视频播放不了,安卓手机/苹果ios视频只有声音却没有画面(uniapp微信小程序也适用)

微信小程序video有声音但是画面黑屏,uni-app微信小程序视频播放黑屏但是有音频,微信小程序video android真机或苹果ios系统中黑屏 只有声音没有画面,Uniapp微信小程序 Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法,解决小程序视频编码兼容性问题导致黑屏,出现黑屏但有声音的问题,video标签播放视频有声音,但是黑屏的原因及解决办法,mp4视频编码的问题,video标签播放视频有声音,但是黑屏。uniapp使用video标签无法播放视频出现黑屏问题处理,如何解

🏆 前端领域优质创作者 7777

07 Zabbix 微信告警

Zabbix 微信告警 1.注册企业微信 企业微信注册地址:https://work.weixin.qq.com 2.进入企业微信后台管理 2.1 添加微信成员 2.2创建应用 2.3 获取四项数据 (1)AgentID (2) Secret (3) 企业ID (4)部门ID 3.Zabbix Server配置 3.1确认脚本目录 # grep alertscripts /etc/zabbix/zabbix_server....

Jian Sun_的博客 1297

C++多态性实验:函数重载、运算符重载与模板编程实战解析

多态性是面向对象编程的核心概念之一,它允许同一接口在不同上下文中表现出不同行为,从而提升代码的灵活性和可复用性。在C++中,多态性主要通过编译时多态(静态多态)和运行时多态(虚函数)实现。编译时多态的核心技术包括函数重载、运算符重载和模板编程,它们能够在编译阶段确定具体调用的函数或生成的代码版本,实现零开销的抽象。这些技术在现代C++工程实践中价值显著,例如函数重载通过同一函数名处理不同类型参数,提升API的直观性;运算符重载让自定义类型支持原生运算符,提高代码表达力;而模板编程作为泛型编程的基石,允许编写

weixin_30599769的博客 609

Unity-TextMeshPro如何扩展材质实现字体Face+Outline流光效果

前言 TexeMeshPro 是Unity的一个Text文本插件,实现了比UGUI的Text,更好看的效果,跟高效的性能,所以深受大家的喜欢,但是再好的插件,也不是万能的,比如我们的策划有个新需求,要我们的VIP的名字比普通玩家有更好看的效果,例如:字体流光,外发光颜色扰动,字体贴图等等。那我们就需要去扩展TextMeshPRo的shader功能了。如下图所示 本文,我就带大家一起来扩展一下:如何扩展TextMeshProUGUI TextMesh原始面板 扩展功能后的面板 扩展TextMeshPro

TxNet 9675

C++运算符重载与友元机制:从原理到实践打造直观自定义类型

在C++面向对象编程中,运算符重载允许开发者为自定义类型定义与内置类型一致的操作符行为,这是实现抽象数据类型和提升代码可读性的核心技术。其原理在于通过成员函数或全局函数重新定义操作符的语义,编译器根据操作数类型选择匹配的重载版本。这项技术的核心价值在于让用户自定义的类(如复数、矩阵、字符串)能够使用直观的算术、比较和流操作符,从而编写出更自然、更易于维护的代码,广泛应用于数学库、容器类和资源管理类的设计中。为了实现某些特定操作符(如流插入`<<`)的对称性或访问多个类的私有成员,需要引入友元机制。友元函数或

weixin_34293246的博客 410

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++友元机制详解:解决封装矛盾与运算符重载的利器

面向对象编程中,封装与访问控制是保障数据安全的核心机制,但严格的私有成员限制有时会让外部函数或类难以协作。C++通过friend关键字(友元)提供一种精确的授权方式,允许指定函数或类访问私有成员,在保持封装性的同时提升灵活性。从编译期原理看,友元并不会破坏封装,而是通过编译期间的访问检查实现定向开放。友元在运算符重载、访问者模式、单元测试等场景中尤为重要,特别是实现operator<<、混合类型运算时几乎是标准方案。掌握友元函数、友元类、友元成员函数的区别与边界,能帮助开发者平衡封装与工程实践,写出更健壮的

weixin_33938733的博客 753

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

转 C++运算符重载 模板友元 new delete ++ = +=

C++运算符重载 模板友元 new delete ++ = += https://www.cnblogs.com/lv-anchoret/p/8342842.html 今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢。 一、类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写在类声明中,那么可以跳过该部分。...

qq_42888201的博客 170

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++友元机制深度解析:从封装突破到运算符重载的工程实践

在C++编程中,封装与访问控制是面向对象设计的基石,而友元机制则是在严格封装之上打开的一扇受控之门。理解friend关键字如何突破私有成员限制,对于掌握运算符重载、迭代器设计及类间协作至关重要。友元关系的本质是类主动授权的访问通道,它遵循不可继承、单向、无传递性的铁律。合理运用友元函数、友元类及成员函数友元,不仅可以优雅实现cout<<对象这样的流式输出,还能在容器与迭代器、渲染器与网格等紧密耦合场景中避免接口膨胀。模板类中友元声明的特化细节与前置声明的顺序问题,则是工程实践中高频踩坑点。通过最小授权原则控

weixin_34357928的博客 206

重载函数模板 友元运算符时出现无法解析问题

 template friend istream& operator>>(istream& in, BiTree  &tree); 或 friend istream& operator>>(istream& out, BiTree  &tree);

renjiewen1995的专栏 612

【专家级C++技巧曝光】:如何优雅实现模板类的友元函数重载

掌握C++模板友元的声明技巧,轻松实现模板类中友元函数的重载与访问控制。适用于运算符重载、跨类数据共享等场景,通过前置声明与友元模板结合提升封装性与灵活性。代码简洁高效,值得收藏。

QuickSolve的博客 296

C++模板友元深度解析:从语法雷区到最佳实践

在C++编程中,友元(friend)机制允许特定类或函数访问其他类的私有成员,是实现运算符重载、工厂模式等场景的关键技术。当友元与模板(template)结合时,其语法规则变得尤为复杂,涉及模板实例化、访问权限绑定等核心原理。理解模板友元的正确用法,能显著提升代码的封装性、安全性和可维护性,避免因权限混淆导致的编译与链接错误。本文聚焦于C++模板友元的三种核心关系模型(一对一、一对多、多对多),结合运算符重载、工厂模式等高频应用场景,深入剖析其标准语法、常见陷阱及跨版本(C++11/14/17/20)的演进

weixin_33834628的博客 469

C++中模板类使用友元模板函数

问题始于学习数据结构,自己编写一个单链表,其中用到了重载输出运算符template class List{    friend std::ostream& operator & slist);    //……};用vs2008可编译,但无法链接:无法解析的外部符号……后来上网查改为template class List{    friend std::ostream& operator

squarereal的专栏 2239

模板类的友元模板函数

问题始于学习数据结构,自己编写一个单链表,其中用到了重载输出运算符 template class List{     friend std::ostream& operator & slist);     //…… };用vs2008可编译,但无法链接:无法解析的外部符号…… 后来上网查改为template class List{     friend std::ostream&

何义峰(C/C++) 342

友元/C++

面试题目1:写一个程序,设计一个点类Point,求两个点之间的距离。 解析:本题可以使用友元。 类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间

s25691011的博客 348

C++模板与友元结合时链接错误的根源与三种解决方案

在C++编程中,模板是实现泛型编程的核心机制,它允许编写与类型无关的通用代码,极大地提升了代码的复用性和灵活性。其工作原理是通过编译器在编译时根据具体类型生成特化代码,这一过程称为模板实例化。模板的技术价值在于能够构建高度抽象且类型安全的容器与算法,是标准模板库(STL)的基石。然而,当模板与另一个重要特性——友元结合时,开发者常会遇到棘手的编译与链接问题。友元机制旨在突破封装,允许特定外部函数或类访问私有成员,但在模板上下文中,其声明与定义的分离容易引发链接器找不到函数实现的错误。这类问题常见于需要为类模

weixin_29297127的博客 316

C++运算符重载 模板友元 new delete ++ = +=

今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢。 一、类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写在类声明中,那么可以跳过该部分。 请看下面这段代码: 头文件: #pragma once template<typename T> class CLA ...

weixin_30443747的博客 195
上一篇: 函数模板和普通函数的抉择
下一篇: string和char*互转以及c_str()的陷阱
UKey_
博客等级 码龄10年 258粉丝 186原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值