编译器使用了错误的函数原型?

2024-01-11

我遇到了一个我不明白的编译问题,我将其简化了一些,以便在下面进行解释。

基本上,它涉及到有 2 个不同的 getter(一个 const 和一个非常量 getter),它们返回一个带有 const 和非常量 value_type 的容器(本例中是一个映射)。

让我困惑的是,在下面的示例中,编译器似乎无法在非常量对象上使用 const getter:

#include "stdafx.h"
#include <utility>
#include <map>

class TestObject
{
public:

    TestObject() {}
    virtual ~TestObject() {}
};

typedef std::pair<const TestObject*, const TestObject*> ConstTestObjectPair;
typedef std::pair<TestObject*, TestObject*> TestObjectPair;

class Test
{
    TestObject* m_pObject;

public:

    Test() {m_pObject = new TestObject();}
    virtual ~Test() {delete m_pObject;}

    std::map<unsigned, ConstTestObjectPair> GetObject() const
    {
        std::map<unsigned, ConstTestObjectPair> map;
        map.insert(std::make_pair(0, std::make_pair(m_pObject, m_pObject)));
        return map;
    }

    std::map<unsigned, TestObjectPair> GetObject()
    {
        std::map<unsigned, TestObjectPair> map;
        map.insert(std::make_pair(0, std::make_pair(m_pObject, m_pObject)));
        return map;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    Test* pTest = new Test();
    const Test* pConstTest = pTest;

    std::map<unsigned, ConstTestObjectPair> CTO = pTest->GetObject(); // Not compiling, I don't get why!!!
    CTO = pConstTest->GetObject();

    std::map<unsigned, TestObjectPair> TO = pTest->GetObject();
    //TO = pConstTest->GetObject(); // Not working, this is expected

    return 0;
}

我尝试使用 VS2010 和 gcc,但都不接受编译此代码。下面是VS2010返回的编译错误:

1>c:\test.cpp(48): error C2440: 'initializing' : cannot convert from 'std::map<_Kty,_Ty>' to 'std::map<_Kty,_Ty>'
1>          with
1>          [
1>              _Kty=unsigned int,
1>              _Ty=TestObjectPair
1>          ]
1>          and
1>          [
1>              _Kty=unsigned int,
1>              _Ty=ConstTestObjectPair
1>          ]
1>          No constructor could take the source type, or constructor overload resolution was ambiguous

有人可以解释一下为什么编译器无法在非常量对象上找到/使用正确的原型吗?

多谢!


如果您真的很好奇,请查看 C++03 标准的第 13.3.3 节,其中描述了如何确定“最佳可行函数”。以下是一些要点:

最佳函数的选择标准是参数的数量、参数的好坏 与候选函数的参数类型的匹配程度(对于非静态成员函数) object 与隐含的对象参数以及候选函数的某些其他属性相匹配。 [笔记: 不保证重载决议选择的函数适合上下文。其他 限制(例如函数的可访问性)可能会使其在调用上下文中的使用格式不正确。 ]

然后:

如果恰好有一个可行函数比所有其他可行函数都更好,那么它就是 由重载决议选择的一个

请注意,此标准中未提及函数的返回类型。因此,非常量方法被选为最有效的,因为它的“隐含对象参数”(本质上是“this”指针)是非常量的。这一切都发生在检测到与返回类型的冲突之前。

为了解决这个问题,我会:

  • 改变你的设计,以便ConstTestObjectPair不需要,你可以直接使用const TestObjectPair(首选解决方案)
  • 需要时将非常量对象转换为常量对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器使用了错误的函数原型? 的相关文章

  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • 移动浏览器检测和格式化的最佳实践

    我为一位希望可以通过移动设备轻松访问的客户开设了一个小型网上商店 如何检测用户是否通过移动设备浏览我的网站 当我这样做之后 我应该 检查用户是否有移动设备 然后将其转发到另一个站点 我认为优点是 我可以优化两个网站的屏幕尺寸布局 我可以在两
  • Facebook API 密钥?与应用程序 ID 相同吗?

    我已经通过 facebook 为我的网站设置了一个应用程序 与我在网络上看到的显示 API 密钥的其他屏幕截图不同 我没有 我显示的只是 应用程序 ID 后面跟着 应用程序秘密 所以想知道应用程序 ID 是否与 API 密钥相同 因为我正在
  • 在 Swift 中制作简单的淡入淡出动画?

    我正在尝试用 Swift 制作一个简单的动画 这是淡入 我尝试过 self myFirstLabel alpha 0 self myFirstButton alpha 0 self mySecondButton alpha 0 然后 我有
  • 将 Post 或 PostAndAsyncReply 与 F# 的 MailboxProcessor 一起使用吗?

    我见过不同的片段展示了Put返回的消息unit与 F 的MailboxProcessor 在某些情况下 仅Post方法被使用而其他人使用PostAndAsyncReply 一旦消息被处理 回复通道立即回复 在进行一些测试时 我发现等待回复时
  • Android Wear 设备选择框显示“offline localhost:4444 minSdk (API 20) > deviceSdk (API 1)”

    我正在尝试构建 Android Wear 应用程序 如果我将 minsdk 设置为 20 21 它给出了下面的错误 但如果我将其设置为 19 则会出现以下错误 home bhupinder AndroidStudioProjects MyW
  • 如何通过每种颜色的分数贡献在 n 种颜色之间进行插值?

    我怎样才能在n种颜色之间进行插值 2种颜色的简单情况 首先考虑一个更简单的情况 我们想要找到两种颜色的中点 Color1 is RGB 255 0 0 Red Color2 is RGB 128 128 128 Grey 解决方案是单独考虑
  • 如何向用户实施有限的功能推出(与语言无关)?

    我想知道向选定的用户群推出新网站功能的一些常见或最佳实践 例如 用户可以仅基于总体用户群的百分比 10 部署应该是可定制的 可配置的 并支持任意数量的功能 将部署与特定用户角色或权限 ACL 相关联也很有用 那么 从本质上讲 什么是能够很好
  • @font-face 不起作用

    我下载了一个字体inlove light wf ttf 为了使用该规则 font face 我的文件夹中有 home html and inlove light wf ttf 在我的 CSS 中我有 font face font famil
  • 如何测试“Mosquitto”服务器?

    我是新来的Mosquitto and MQTT 我下载了Mosquitto服务器库 但我不知道如何测试它 有什么办法可以测试一下Mosquitto server 在单独的终端窗口中执行以下操作 启动代理 mosquitto 启动命令行订阅者
  • 我可以将实体字段名称映射到 TypeORM 中的别名列名称吗?

    我正在使用 TypeORM 从 Rails 迁移到 NestJs 由于历史原因 Rails 中的表名和列名是snaked cased 我不想将这种麻烦复制到我们的 NestJs React 端 我可以在 NestJS typeorm 中创建
  • 使用新范围更新 Google 工作表“过滤器视图”

    我有一个电子表格 其中设置了各种过滤器视图 通常这很有效 但偶尔会添加新行 我必须手动更新每个过滤器视图中的范围 我尝试在线搜索解决方案 并提出了以下可能更新范围的代码 function UpdateFilterView var dataS
  • xcode4 工作区中的两个项目(#import 失败)

    我真的很难让它在 xcode 4 中工作 我有一个项目将在许多应用程序 网络 中重用 因此我创建一个工作区并添加我的两个项目 到目前为止 一切都很好 这就是失败的地方 import JSONRequest h 没有明显的原因 它自动完成头文
  • 在单个表列中存储多个位值

    我需要在数据库中存储某种一周中的日程安排 我可以在其中安排一周中的一天或多天的记录 假设它代表一个任务 我需要将其存储在一列中 以便于保存和检索 然后每天我都会选择时间表与本周的当前日期相匹配的记录 例如 获取时间表与第 7 周的日期相匹配
  • 内部矩阵尺寸必须一致

    我有一个矩阵A和一个向量x A是一个 50x30 矩阵 x是一个 1x30 向量 我想要倍增A by x 但每当我尝试z A x我收到错误Inner matrix dimensions must agree 然而 在列数相同的情况下 矩阵维
  • Elasticsearch Painless 计算嵌套元素的分数

    Note 我最初发布这个问题的方式有点不同 不值得更新 因为阅读后我学到了更多 要求 搜索文档并根据文档中的嵌套元素计算自定义分数 结构 mappings book properties title type string index no
  • 使用 gdb 中的函数调用堆栈进行导航

    在 Visual Studio 中 如果单击调用堆栈中的某个条目 则会打开编辑器并显示该函数的源代码 gdb 中可能有类似的东西吗 我在 gdb 中使用 tui 文本用户界面 是否可以让 tui 显示回溯中给定条目的源代码 如果没有 那么如
  • 如何在较新版本的 VS 中通过 UI 更改单元测试属性?

    几个月前 当我在使用 MSTest 进行单元测试时阅读有关数据源的内容时 我偶然发现了一些旧帖子 声称这只是进入属性并在 gui 上设置数据源的问题 这导致该属性与所需的参数一起自动添加到测试方法中 不过 我始终无法在属性网格上选择单元测试
  • 如何检查是否已为 VIRTUALENVWRAPPER_PYTHON=/usr/bin/python 等安装 virtualenvwrapper

    我正在遵循有关 Python 的 virtualenv 的指南 但遇到了一个小问题 Sahands MBP empty sahandzarrinkoub source usr local bin virtualenvwrapper sh u
  • 删除结构 C++ 向量中的重复项

    我有以下结构 我想将结构存储在向量中 其次我想删除 context 我究竟做错了什么 include
  • 编译器使用了错误的函数原型?

    我遇到了一个我不明白的编译问题 我将其简化了一些 以便在下面进行解释 基本上 它涉及到有 2 个不同的 getter 一个 const 和一个非常量 getter 它们返回一个带有 const 和非常量 value type 的容器 本例中