首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我返回指向协议的指针时,为什么会出现编译错误?

当返回指向协议的指针时,可能会出现编译错误的原因是协议本身是一种抽象的类型,它只定义了一组方法或属性的声明,而没有具体的实现。因此,编译器无法确定返回的指针所指向的具体类型的大小和结构。

在面向对象的编程语言中,协议通常被用作接口的替代方案,用于定义一组方法或属性的声明,以便多个类可以遵循该协议并实现这些方法或属性。当一个类遵循了某个协议并实现了其中的方法或属性时,可以将该类的实例赋值给该协议类型的变量或返回该协议类型的指针。

然而,由于协议本身没有具体的实现,返回指向协议的指针时,编译器无法确定具体的类型信息,因此无法进行正确的内存分配和访问。这就导致了编译错误的出现。

为了解决这个问题,可以考虑以下几种方法:

  1. 使用具体的类型替代协议类型:如果在返回指向协议的指针时,可以确定具体的类型,可以将协议类型替换为具体的类型,从而避免编译错误。
  2. 使用泛型:一些编程语言提供了泛型的支持,可以在返回指向协议的指针时使用泛型来表示不确定的类型,从而避免编译错误。
  3. 使用协议的关联类型:一些编程语言提供了关联类型的支持,可以在协议中定义关联类型,从而在返回指向协议的指针时,编译器可以根据具体的类型来确定大小和结构。

需要注意的是,以上方法的适用性和具体实现方式可能因编程语言而异。在具体的开发过程中,可以根据编程语言的特性和需求来选择合适的方法来解决编译错误。

相关搜索:为什么这个指向C++函数代码的指针会产生编译错误?初始化指向指针的指针时出现C++错误尝试访问指针列表中的指针时出现C总线错误,指针列表是指向指针的结构指针将指向结构类型参数的指针传递给函数时出现C++编译错误尝试删除指向派生对象的基指针时出现断言错误当基类指针指向基类中声明的派生类虚函数时,为什么会出现编译时错误?将指向正向声明的类型的指针推入typedef'd向量时出现编译器错误尝试存储指向另一个指针变量的指针时出现分段错误为什么当我使用"is“而不是"==”时,np.all会返回错误的值?当我尝试使用"this“指针时出现预期的表达式错误将shared_ptr与指向指针的指针一起使用时出现编译器错误编译包含指向模板函数的指针的初始化器列表时,出现了gcc错误,而不是clang错误当我只使用#include<math.h>时,为什么会出现编译错误?当我从root重新初始化它时,为什么我的指针指向null执行strncpy指向字符串数组C的指针时出现分段错误当我尝试使用带有参数的priority_queue作为指向结构的指针时,为什么会弹出错误当我尝试将索引分配给nullptr时,指向数组抛出错误的指针将指向类的链接作为方法参数时出现编译器错误使用指向以unordered_map为成员的类的指针时出现段错误当我尝试使用我的结构时,为什么会出现错误?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C语言进阶篇】常用动态内存分配 malloc calloc realloc free

如果开辟成功,则返回一个指向开辟好空间指针。 如果开辟失败,则返回一个NULL指针,因此malloc返回值一定要做检查。...下面就给大家观察一下开辟失败是什么样 图片展示: ⛳️ 大家看这里当我们申请空间太大是开辟不了就会给我们返回空间不够错误提示 ps:申请空间一定要非常大不然测试就不会返回错误 博主试了好几遍还以为是自己代码问题结果是申请空间太小了...你又要malloc申请空间,又只申请0个空间,这种行为本来就是不合理,所以我们在使用malloc要避免这种情况以免出现不必要错误!...malloc申请空间主动释放嘛   ⛳️而malloc申请空间,当程序退出,才会还给操作系统,而当程序未结束,动态内存申请内存空间,是不会主动释放。这样就会照成内存浪费!...这里我们思考一个问题,realloc也返回失败那么就会返回NULL空指针

34710
  • iOS16 和 Xcode14 如何改进 App 大小和运行时性能

    部分元数据是在编译期间构建,但是很多元数据只能在启动构建生成,尤其是当使用泛型Generics 。 当你使用很多协议协议检查耗时可能累积到数百毫秒。...这正是协议检查优化为什么让启动加快原因。而且在纯 Swift 项目中,协议无处不在,这种优化相对更明显。...在高代码层面(比如业务层面,应用层),当我们复制指向某个对象指针,需要增加对象引用计数,让该对象保持活跃引用状态(copy方法就会做这个事)。...因此,对于 ARC,编译插入对这些 C 函数调用,并传递适当对象指针。...<-----我们所在位置,并获得指向当前返回地址指针 b _objc_autoreleaseReturnValue 因为仅仅是比较两个指针,这个代价相当小。

    3.9K30

    C语言重点突破(五) 动态内存管理

    如果开辟成功,则返回一个指向开辟好空间指针。 如果开辟失败,则返回一个NULL指针,因此malloc返回值一定要做检查。...因此,在进行指针解引用操作之前,应该先检查指针是否为NULL,否则可能会出现难以调试错误。...当我们使用malloc或new等函数在堆上动态开辟空间,如果我们访问这些内存空间之外位置,就会导致指针指向了非法内存地址。...当程序运行结束编译自动释放所有的内存。如果程序中使用了free/delete等函数来释放非动态开辟内存,导致内存被重复释放,从而可能导致程序崩溃或其他未知行为。...操作系统在释放一块内存后,会将这块内存标记为可用,再次释放已经被释放块,导致操作系统数据结构出现问题。 为了避免这种错误,我们需要使用合适内存管理技术,如内存池、智能指针等。

    13510

    面试常考知识点总结——面试必看

    哈希表查询时间复杂度为多少? 答:数组+链表,主干为数组,当某个节点出现多次,则用链表组织这些相等节点。...函数递归调用时,系统要在栈中不断保存函数调用时现场和产生变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深也可能导致栈无法容纳这些调用返回地址而造成栈溢出。...C语言没有提供数组下标越界检查,如果在程序中出现数组下标访问超出数组范围,在运行过程中可能内存访问错误指针非法访问。...指针保存了一个非法地址,通过这样指针访问所指向地址时会产生内存访问错误。 什么函数不能声明为虚函数? (1)不能被继承函数。 (2)不能被重写函数。...但是静态成员函数是编译确定,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。 Internet采用哪种网络协议?该协议主要层次结构?

    84020

    virtual

    这也很自然解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数很有可能不关心返回值,编译器就无法从代码中看书程序在调用是哪个函数。...虚函数指针类中除了定义函数成员,还有一个成员是虚函数表指针(占4个基本内存单元),这个指针指向一个虚函数表起始位置,这个表会与类定义同时出现,这个表存放着该类虚函数指针,调用时候可以找到该类虚函数表指针...父类指针=new 子类名(……); 父类指针->函数名(……); 调用子类虚函数 虚析构函数实现原理 虚析构函数实现原理: 当我们在父类中通过virtual修饰析构函数之后,通过父类指针指向子类对象...原理: 如果父类当中定义了虚析构函数,那么父类析构函数表当中就会有一个父类虚析构函数指针指向是父类虚析构函数,子类虚析构函数表当中也产生一个子类虚析构函数入口指针指向是子类虚析构函数...,这个时候使用父类指针指向子类对象,delete接父类指针,就会通过指向子类对象找到子类虚函数表指针,从而找到虚函数表,在虚函数表中找到子类虚析构函数,从而使得子类析构函数得以执行,子类析构函数执行之后系统自动执行父类虚析构函数

    65250

    计算机考研复试C语言常见面试题「建议收藏」

    使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出了类作用域,类自动调用析构函数,析构函数自动释放资源。...它使用计数机制来表明资源被几个指针共享。当我们调用release(),当前指针释放资源所有权,计数减一。当计数等于0,资源会被释放。...为什么C++默认析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类,可以使用基类指针指向该子类对象,释放基类指针可以释放掉子类空间,防止内存泄漏。...ID; (2)fork向新创建子进程返回0,以告知它已经被成功创建; (3)如果出现错误,fork返回一个负值; 创建新进程成功后,系统中出现两个基本完全相同进程,这两个进程执行没有固定先后顺序,...静态多态:也称为编译期间多态,编译器根据函数实参类型,可推断出要调用哪个函数,如果没有对应函数则出现编译错误。 动态多态主要是调用虚函数,根据虚函数表确定具体调用模块。

    1.6K30

    【C语言】内存动态分配与释放

    ,该空间内所有位都会初始化为0 返回值 若分配成功,则返回一个指向已分配空间开头指针;若分配失败,则返回指针 如果想了解更多关于calloc()函数相关信息,如calloc()函数参数设定...,重新分配为size大小 返回值 若分配成功,则返回一个指向已分配空间开头指针;若分配失败,则返回指针 如果想了解更多关于realloc()函数相关信息,如realloc()函数参数设定,返回设定...,让这部分空间能继续用于之后动态分配.当ptr为空指针,不执行任何操作.除此之外,当实际参数与之前通过malloc(),calloc(),realloc()返回指针不一致,或者ptr指向空间已经通过调用...而当我们不对malloc()函数开辟结果做检查的话,就很可能导致以下这种情况: 因此,为防止在使用动态内存开辟函数造成对空指针解引用操作,我们在每次使用完动态内存开辟函数后,都应先检查一下它返回值...因此,在使用动态内存开辟空间,我们要格外小心不要出现越界访问问题. 3.对非动态开辟内存使用free释放 因为p是由编译器分配到栈区,不属于堆区,因此不能使用free释放. void test

    15110

    由C语言过渡到C++敲门砖

    返回值不同 当返回值不同时候,我们在使用时候无法识别出要使用哪一个函数,因为使用哦时候仅仅是调用,不会显式告诉编译器你要用哪个返回函数,所以返回值不同函数不能构成重载。...常量延伸 (表达式1 + 表达式2)在赋值产生临时对象 注意:临时对象具有常性!...• sizeof中含义不同,引⽤结果为引⽤类型⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte) • 指针很容易出现指针和野指针问题,引⽤很少出现,引⽤使...debug版本下⾯默认是不展开inline,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅ inline不建议声明和定义分离到两个⽂件,分离导致链接错误。...但加上括号后,宏展开为 ((a)++) + b,这在大多数编译器中是不允许,因为不允许对括号内表达式进行递增操作,从而避免了这种错误

    8310

    C语言灵魂——指针

    char* p0; p0 = p; 这会提示一个编译错误,因为p0是一个字符型指针,而p是一个整型指针。 下面我们进行强制类型转换,并进行输出。...(p0+1也是不行,也会有编译错误) printf("%d\n",p1); 3.指向指针指针 直接上代码 #include int main(void) { int x =...解释: main()是主调函数,Increment()是被调函数,当我们在主调函数中调用其他函数,这个参数叫做实参,这个被调函数参数叫做形参,实参会被映射到形参,当这个函数被调用时候,主函数中实参...不同点: B返回一个指向一个一维数组指针,而*B返回一个指向整型指针当我们只是打印地址时候,一维数组B[0]和B[0]首元素起始地址是一样,所以打印地址是相同指针类型会在你尝试解引用时或者尝试做指针算术时候起作用...多维数组作为参数传给函数 (是几维数组,使用数组名作为指针返回几维度-1指针) (例如:一维数组返回指向整型指针,二维数组返回指向一维数组指针,三维数组返回指二维数组指针…) 多维数组作为函数参数时候

    93110

    【C语言】动态内存管理

    文章目录 一、为什么存在动态内存分配 二、动态内存开辟函数 1、malloc 2、free 3、calloc 4、realloc 三、常见动态内存错误 1、对NULL指针解引用操作 2、对动态开辟空间越界访问...p = NULL; //将p置空,防止野指针 } 注意事项 malloc 如果开辟成功,则返回一个指向成功开辟空间指针;如果开辟失败,则返回一个NULL指针,因此 malloc 返回值一定要做检查...:free,需要程序员主动调用这个函数来释放空间; 当然,当我们关闭整个程序时候,操作系统是自动回收动态开辟内存(这就是为什么有的电脑故障关机重启之后问题就解决了);但是,在一些公司大项目中,...,我们可能会在后面的程序中让该指针变量自增,从而让其不再指向该动态空间起始位置,而是指向中间位置或者结尾,这时我们在对其进行free操作,也导致程序崩溃,因为free函数必须释放一整块动态内存,而不能释放它一部分...GetMemory函数,让其指向了一块动态开辟空间,但是这里没有对malloc函数返回值进行检查,当malloc失败时候还是产生空指针问题; 第二:程序中没有对malloc空间进行free

    1.6K00

    《Objective C编程》笔记

    1.为什么main()总是返回0?可以将main()返回结果视为“粗欧文报告”,这样0就是好消息,没有错误就是成功。 2.消息:消息发送(指令)必须写在一对括号中,并且必须包含以下两个部分。...指针指向接收消息对象。 方法名,要触发方法方法名。 3.如果在编写程序时,如声明指针,不知道所指对象准确类型,为此可以使用id类型。...NSArraycopy方法其实不会做任何额外工作,仅仅返回指向自己指针而已。而NSMutableArraycpy方法则会制作一份自己拷贝,并返回指向新数组对象指针。...当其中某个通告出现时,向指定对象发送特定消息。 19.选择器:当某个对象收到消息,向该对象类进行查询,检查是否有与之匹配方法。因此该方法必须非常快速。...如果该对象被释放,那么相应实例变量就会被自动赋为nil(如果在声明指针变量,使用是unsafe_unretain特性,那么当其指向对象被释放后,该指针变为悬空指针

    60130

    类和对象:运算符重载

    当你尝试将赋值运算符重载为全局函数,会出现问题,原因如下: 成员访问权限:作为全局函数,赋值运算符将无法访问类非公共(private或protected)成员变量。...成员函数可以直接访问这些成员,因为它们是类一部分。 this指针:成员函数有一个隐式指针 this,它指向调用该成员函数对象。...尝试将其定义为非成员函数导致编译错误,因为编译器期望赋值运算符是类成员。 语义问题:赋值运算符语义是将一个对象值设置为另一个对象值。...这是为了保持语言一致性和防止潜在错误使用。 因此,当尝试将赋值运算符重载为全局函数编译器会报错,因为它违反了C++规则和赋值运算符预期行为。...如果类中包含了其他自定义类型作为其成员变量,并且这些自定义类型重载了赋值运算符 =,那么在进行类实例赋值操作编译尝试调用这些成员变量类型赋值运算符来完成赋值(MyQueue)。

    10210

    初识函数栈帧创建与销毁(笔记)

    当函数调用另一个函数,调用者会将一些数据(如函数参数)压入堆栈中,ESP寄存器随之向下移动,指向堆栈顶部。在函数返回后,又会通过调整ESP寄存器值来释放堆栈空间。 4....返回地址:返回地址是指函数调用完成后要返回指令地址。通常,编译器会在函数调用时将返回地址压入栈中,并在函数运行结束用该地址将控制权转回到调用者函数。 5....栈溢出是一种常见编程错误,可能导致程序意外终止或行为异常。避免栈溢出方法包括使用堆分配内存或优化函数栈帧大小等。...当Add函数被调用时,编译执行以下步骤来创建函数栈帧: 1. 首先,编译器将函数返回地址和旧栈帧指针(EBP)保存在栈上。 2....,就能找esp顶,下一个空间 我们记住了call指令下一条地址,当我们往回返时候, 就可以转到call指令下一条指令地址,让函数返回 返回值是通过寄存器带回来 函数返回指向形参指针时候

    17610

    C++:33---类成员指针

    成员指针概述: 当初始化一个这样指针,我们令其指向某个成员,但是不指定该成员所属对象 直到使用成员指针,才提供成员所属对象 成员指针是指可以指向非静态成员指针 一般情况下,指针指向一个对象...->contents 返回数据成员指针函数 在上面定义成员指针时候,pdata不能出现在Screen类外部,因为contents是private(上面只是为了演示说明) 为了体现封装性,我们通常定义一个成员函数...与指向数据成员指针类似,我们也可以声明一个指向于成员函数指针 语法注意事项: 指向成员函数指针也需要指定目标函数返回类型和形参列表 如果成员函数const或者是引用成员,则我们必须将const...如果没有这对括号,编译器将认为该声明是一个(无效)函数声明: 错误原因:编译认为p是一个普通函数,并且返回Screen类一个char成员。...,如果不加,那么错误错误原因:我们想要调用名为pmf和pmf2函数,然后使用这些函数返回值作为指针指向成员运算符.

    87730

    QT(C++)面试总结

    ,能够在编译就发现错误;并支持类型隐式转换。...3.引用 引用是一种特殊指针。引用是一个指向其它对象常量指针,它保存着所指对象存储地址。并且使用时候自动解引用,而不需要像使用指针一样显式提领。...编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能产生意料不到错误。...,希望链接成一个完整可执行文件,就会出现大量错误,因为每一个相同头文件都会进行所谓“重定义”;而加上上面那三句,则不会出现“重定义”情况。...…… #endif 注意事项: #ifndef AAA #define AAA … int i; … #endif 里面有一个变量定义 在vc中链接出现了i重复定义错误,而在c中成功编译

    2K10

    大厂面试经历(附100+面试题干货)

    指针:是一个变量类型;指针可以不进行初始化;指针初始化后可以改变,在写代码需要大量检测    引用:是一个别名;引用必须要初始化;引用初始化后不可改变,无需检测  15:出现异常,try和catch...原因:多文件处理变为一个文件其实是通过链接器来实现,所以如果用源文件来处理模板实现,导致链接失效,最主要原因还是在编译编译暂时不处理模板类只有在实例化对象才去处理,但是这就需要实现代码了...那虚表指针呢?   编译确定虚函数表,虚表指针则是运行时  85:如何检查内存泄露?如果不通过printf,debug等调试方式和编译器报错提示呢?  ...一个函数,参数为int和指向返回值为void无参数函数指针返回值为一个指向返回值为int,参数为int和int函数指针  87:STL空间配置器如何处理内存?能说一下它大概实现方案吗?...next是一个指针指向一个函数,这个函数返回一个指针,这个指针指向char类型常量指针  105:访问一个网页过程,计算机发生了什么?

    1.3K20

    知识总结:C++工程师106道面试题总结(含答案详解)

    指针:是一个变量类型;指针可以不进行初始化;指针初始化后可以改变,在写代码需要大量检测    引用:是一个别名;引用必须要初始化;引用初始化后不可改变,无需检测  出现异常,try和catch做了什么...原因:多文件处理变为一个文件其实是通过链接器来实现,所以如果用源文件来处理模板实现,导致链接失效,最主要原因还是在编译编译暂时不处理模板类只有在实例化对象才去处理,但是这就需要实现代码了...那虚表指针呢?   编译确定虚函数表,虚表指针则是运行时  如何检查内存泄露?如果不通过printf,debug等调试方式和编译器报错提示呢?  ...一个函数,参数为int和指向返回值为void无参数函数指针返回值为一个指向返回值为int,参数为int和int函数指针  STL空间配置器如何处理内存?能说一下它大概实现方案吗?...next是一个指针指向一个函数,这个函数返回一个指针,这个指针指向char类型常量指针  访问一个网页过程,计算机发生了什么?

    2.5K90

    CC++ 技术面试基础知识总结

    只能在堆上 方法:将析构函数设置为私有 原因:C++ 是静态绑定语言,编译器管理栈上对象生命周期,编译器在为类对象分配栈空间先检查类析构函数访问性。...当读成功,read 返回实际所读字节数。 如果返回值是 0 表示已经读到文件结束了,小于 0 表示出现错误。...成功返回字节数。失败返回 -1,并设置 errno 变量。 在网络程序中,当我们向套接字文件描述符写时有俩种可能。 (1)write 返回值大于 0,表示写了部分或者是全部数据。...(2)返回值小于 0,此时出现错误。 如果错误为 EINTR 表示在写时候出现了中断错误;如果为 EPIPE 表示网络连接出现了问题(对方已经关闭了连接)。...当指针指向一个不允许读写内存地址,而程序却试图利用指针来读或写该地址,会出现这个错误

    1.7K20

    CC++ const

    前者表示指针p指向整型常变量(指针所指单元内容不允许修改),而指针本身可以指向其他常变量,即p为指向常量指针——常量指针。...p1不 是指针常量,它所指向变量类型是int const *(指向整型常量指针)。P2也不是指针常量,其指向变量类型是int* const(整型指针常量)。...(4)非只读对象(如a1)调用某个函数,先寻找它非const函数版本,如果没有找到,再调用它const函数版本。而常对象(a2),只能调用类中定义常函数,否则出现编译错误。...(5)存在const和非const版本成员函数,普通对象若想调用const函数,应该通过建立该对象常引用或指向该对象指针。...此外,还需要注意为什么使用const定义变量,C++编译器并不为const变量创建存储空间,相反把这个定义保存在符号表里。那是因为编译时会进行常量折叠。

    85910
    领券