`

C++ 返回值 协变问题

阅读更多

今天代码遇到了返回值协变问题,不知如何解决,发出来与大家讨论一下。

 

首先介绍一下Ice的智能指针技术,是通过对象继承IceUtil::Shared,指针通过模板类IceUtil::Handle实现的。

例:

class Value : public IceUtil::Shared {

  int v;

};

 

typedef IceUtil::Handle<Value> ValuePtr;

 

void test() {

  ValuePtr p = new Value;

}

 

下面说一下我的问题,项目中需要构造许多Pool,我的设计如下:

数据存储结构抽象类

class BaseStruct : public IceUtil::Shared {

  virtual string ToString()=0;

};

typedef IceUtil::Handle<BaseStruct> BaseStructPtr;

 

class BasePool {

  virtual BaseStructPtr GetValue(Ice::Long) = 0;

  virtual size_t Size();

};

 

class AStruct : public BaseStruct {

  ...

};

typedef IceUtil::Handle<AStruct> AStructPrt;

class APool : public BasePool , Singleton<APool> {

  AStructPtr GetValue(Ice::Long) {   //此行定义会有问题,因为编译器认为AStructPtr和BaseStructPtr无关,不能协变

   ...

   return a AStructPtr;

  }

   ...

};

 

 

 

如果采用pool中不存储智能指针,估计没有问题。求高人帮助

0
0
分享到:
评论

相关推荐

    浅谈C++重载、重写、重定义

    一、重载(overload) 指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。...(5)返回值相同(或是协变),否则报错;&lt;—-协变这个概念我也是第一次才知道… (6)重写函数的

    软协寒假测评试题

    根据给定的软协寒假测评试题,我们可以将其中的关键知识点归纳总结如下: ### C语言知识点 #### 1.1 强制类型转换 - **题目描述**:将一个`int`类型的变量`a`(其值为184)强制转换为`char`类型后输出。 - **知识...

    C++面向对象之多态的实现和应用详解

    2. 函数名、参数列表以及返回值必须相同(除了返回值类型可以是协变的,即派生类类型的指针或引用可以赋值给基类类型的指针或引用)。 3. 基类函数必须声明为虚函数(用`virtual`关键字)。 4. 访问修饰符可以不同,...

    Calling Conventions Topics

    在 C 和 C++ 编程语言中,函数调用约定(Calling Conventions)定义了如何在函数调用时传递参数、返回值以及清理调用栈的方式。不同的调用约定适用于不同的场景,并且对程序的性能和可移植性有着重要的影响。本文将...

    关于汇编语言和C语言接口技术的研究

    然而,在某些场景下,为了进一步优化性能或者实现特定硬件功能,汇编语言的使用变得不可或缺。因此,理解和掌握C语言与汇编语言的接口技术成为了一个重要的课题。本文将深入探讨在C程序中集成汇编代码的重要性及其...

    泛型编程的案例

    C#的泛型还支持协变和逆变,使得在处理接口和委托时更加灵活。 最后,我们来看C++的模板。C++的模板功能非常强大,不仅可以用于创建泛型类,还可以用于函数。例如,一个简单的模板函数可以实现两个数值的加法: ``...

    C#和 Java比较

    在泛型的支持上,C#的泛型机制比Java更为强大,支持类型推断和协变/逆变。Java的泛型是擦除的,而C#的泛型是类型安全的。 在多线程处理上,C#有`Task`和`Thread`等并发模型,而Java有`Thread`类和`ExecutorService`...

    MSDN离线版C# 脚本手册 C# 指南.pdf

    - **对Func和Action泛型委托使用变体**:探讨如何在Func和Action委托中应用协变。 #### 十七、LINQ to Objects - **概述**:提供了一个关于LINQ to Objects的简介。 - **LINQ和字符串**:介绍如何使用LINQ操作字符...

    C#基础理论知识总结

    - 泛型:C#的泛型更强大,支持类型约束和协变/逆变;Java泛型是擦除的,不支持这些特性。 - 枚举和委托:C#的枚举和委托是类型安全的,Java的枚举和事件处理机制与此不同。 四、C#高级特性 1. LINQ(Language ...

    C 语言教程 C 语言教程

    7. **函数**: 函数的定义、调用、参数传递以及返回值。 8. **作用域和存储类型**: 变量的作用域(局部变量、全局变量等)和存储类型(自动、静态等)。 9. **递归**: 函数调用自身的方法。 10. **指针**: 包括指针的...

    GCC技术参考大全

    2. **指定平台**:如`-fp-ret-in-387`,适用于Intel 386平台,用于指定浮点数返回值存储于387浮点协处理器中。 3. **通用选项**:如`-v`表示详细模式,显示编译过程的详细信息;`--help`则提供所有可用选项的帮助...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    18.5.1 协变接口 341 18.5.2 逆变接口 343 第18章快速参考 345 第19章 枚举集合 347 19.1 枚举集合中的元素 347 19.1.1 手动实现枚举器 348 19.1.2 实现ienumerable接口 352 19.2 使用迭代器来实现枚举器 354...

    nasm PC汇编语言 教程

    目录 前言i 第1章简介1 1.1 数制. . . . . . ....1.1.1 十进制....1.1.2 二进制....1.1.3 十六进制....1.2 计算机结构....1.2.1 内存....1.2.2 CPU ....1.2.3 CPU 80x86系列....1.2.4 8086 16位寄存器....1.2.5 80386 32位寄存器....

Global site tag (gtag.js) - Google Analytics