对基类模板成员函数的不明确访问

2023-11-22

在 Visual Studio 2008 中,编译器无法解析对SetCustomer in _tmain下面并使其明确:

template <typename TConsumer>
struct Producer
{
    void SetConsumer(TConsumer* consumer) { consumer_ = consumer; }

    TConsumer* consumer_;
};

struct AppleConsumer
{
};

struct MeatConsumer
{
};

struct ShillyShallyProducer : public Producer<AppleConsumer>,
                              public Producer<MeatConsumer>
{
};

int _tmain(int argc, _TCHAR* argv[])
{
    ShillyShallyProducer producer;
    AppleConsumer consumer;
    producer.SetConsumer(&consumer);   //  <--- Ambiguous call!!

    return 0;
}

这是编译错误:

// error C2385: ambiguous access of 'SetConsumer'
//    could be the 'SetConsumer' in base 'Producer<AppleConsumer>'
//    or could be the 'SetConsumer' in base 'Producer<MeatConsumer>'

我认为模板参数查找机制足够聪明,可以推断出正确的基数Producer。为什么不是呢?

我可以通过改变来解决这个问题Producer to

template <typename TConsumer>
struct Producer
{
    template <typename TConsumer2>
    void SetConsumer(TConsumer2* consumer) { consumer_ = consumer; }

    TConsumer* consumer_;
};

并打电话SetConsumer as

    producer.SetConsumer<AppleConsumer>(&consumer);   // Unambiguous call!!

但如果我不必... 那就更好了


我认为模板参数查找机制足够聪明,可以推断出正确的基本生产者。

这与模板无关,它来自使用多个基类 - 名称查找已经不明确,并且重载解析仅在此之后发生。

一个简化的例子如下:

struct A { void f()    {} };
struct B { void f(int) {} };
struct C : A, B {};

C c;
c.f(1); // ambiguous

解决方法是显式限定调用或将函数引入派生类范围:

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

对基类模板成员函数的不明确访问 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何重定向到另一个页面并从表中传递 url 中的参数?

    如何重定向到另一个页面并从表中传递 url 中的参数 我在龙卷风模板中创建了类似的东西 table thead tr th Username th th Nation th th Rank th th th tr thead tbody f
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大

随机推荐

  • 错误:“:”不是有效的资源名称字符

    我已将 Eclipse 项目导入到 android studio 我用 google 搜索但没有得到正确的答案 发生这些错误 D app src main res values strings xml Error Error is not
  • 测量 Android 上的数据漫游流量?

    刚从冰岛度过一个愉快的假期回来 正在等待我的电话公司的数据漫游账单 我希望尽可能限制我的流量 但我想提前知道 我使用了非常好的应用程序网络计数器但它根本没有测量漫游数据流量 所以我想构建自己的应用程序 仅测量漫游数据流量 我有一些布尔值要开
  • 使用 == 比较 numpy 数组的规则是什么?

    例如 尝试理解这些结果 gt gt gt x array 0 1 2 3 4 5 6 7 8 9 gt gt gt x np array 1 2 astype np float32 array 0 1 0 0 0 0 0 0 0 0 0 0
  • npm run 分段错误:11

    我正在尝试 npm run HOT 1 node node modules bin react native webpack server start hot 收到此错误 gt email protected hot Users user
  • Chartkick 柱形图多种颜色

    我在用着图表踢在我的 RoR 项目中生成图表 效果非常好 与谷歌图表一起 我创建了一个柱形图 with 只有 2 个酒吧 男性和女性 现在客户希望每个条形都有不同的颜色 那可能吗 我看过这个帖子 如何更改使用 Chartkick 创建的柱形
  • 如何显示 bash 会话的当前进程树?

    我想创建一个 bash 别名 它为我提供从我正在使用的当前 bash 会话到 init 的进程树 用例是为了知道我是否使用过bash or vi s shell命令 我正在使用 MacOS X 我听说过pstree 但是好像只显示子进程 而
  • 在 Typescript 中向数组添加属性

    我正在尝试向 Typescript 中的 Array 对象添加一个方法 我已经在 SO 上找到了其他解决方案 但这些解决方案都不适合我 我的代码如下所示 interface Array average gt number Array pro
  • 需要根据元素升序将列表划分为列表(Haskell)

    假设我有这样的列表 4 5 6 7 1 2 3 4 5 6 1 2 我需要一个 Haskell 函数来将该列表转换为一个列表列表 该列表由原始列表的片段组成 这些片段按升序形成一系列 所以结果应该是这样的 4 5 6 7 1 2 3 4 5
  • 在不可变类中,为什么字段被标记为私有?

    创建不可变类时将字段设为私有有什么好处 我见过为什么在创建不可变类时 字段被声明为私有 但我没有从这篇文章中理解任何内容 有人可以向我解释一下吗 最好的解释方法是举个例子 public class Immutable private fin
  • 如何使用 WMI 和 Python 弹出 CD?

    使用 Windows 的 WMI 库 如何弹出安装在特定 CD DVD 驱动器中的 CD ROM 由于我在 Python 上使用 wmi py 库 因此我要求获取 WMI 文档或示例的源代码 如果解决方案能够满足比 Windows 2000
  • scala - 将超过22个元素的json解析为案例类

    这个问题或类似的问题之前曾发布过 但是没有一个解决方案适用于最新的库 经过广泛的搜索 到目前为止 我没有发现任何证据表明最流行的库的最新版本spray json or play json 或其插件 可以处理这种情况 有没有什么东西可以将超过
  • 为什么java内部函数仍然有代码?

    Java API 中有许多方法是内在函数 但在查看源代码时仍然具有与其关联的代码 例如 Integer bitCount 是一个内在函数 但如果您打开 Integer 类文件 您可以看到包含它的代码 如果编译器 jvm 不一定使用该代码 那
  • 先验算法

    我之前曾多次听说过 Apriori 算法 但从未有时间或机会深入研究它 有人可以用简单的方式向我解释该算法的工作原理吗 另外 一个基本的例子会让我更容易理解 先验算法 它是一种用于数据集中频繁模式挖掘的候选生成和测试方法 有两件事你必须记住
  • 如何在 tmap 中定位标题和图例?

    我是编程新手 目前正在参加使用 R 的空间分析入门课程 以下代码生成下面包含的 tmap 如何将每个 tmap 的标题居中并将图例放置在右上角 而不将其放在地图本身之上 非常感谢你的协助 ga1 tm shape a2georgia tm
  • 为什么 Babel 7 对浏览器使用 require() 函数,而浏览器对此一无所知?

    我尝试在我的模块中使用 d3 js 我使用 Babel 7 来转译我的代码源 这是我的package json name d3 learning version 1 0 0 description main index js directo
  • D8045:无法使用 /clr 选项编译 C 文件“serialcommands.c”

    我收到编译器错误 D8045 无法使用 clr 选项编译 C 文件 serialcommands c 该文件是一个 C 库 编写用于通过串行端口与 TI 处理器进行通信 我需要做的任务是用 CLR 包装器包装这个库 如果您想从 CLI 问题
  • 使用 axwindowsMediaPlayer 创建播放列表时发生灾难性失败(HRESULT 异常:0x8000FFFF)

    我正在使用 axwindowsMediaPlayer 对象在 winform 中显示视频 我特别想播放一个播放列表 在我的电脑 win7 上一切正常 并且在另一台装有 winXP 的电脑 最终用户的电脑 上也可以正常工作 但几天前发生了一些
  • Bokeh 工具在 QWebView 中不起作用

    下午好 经过多年的阅读 第一次在 stackoverflow 上发帖 令人兴奋 我使用 bokeh 生成 html 代码 并将其输入到一个非常简单的 PyQt4 GUI 中的 QWebView 中 散景图顶部的标准工具在 QWebView
  • asp.net-mvc 中的缓存

    我想在我的 asp net mvc 站点中缓存最繁重的数据库操作 在我的研究中我发现 甜甜圈缓存在菲尔的博客上 缓存 压缩Kazi 博客上的过滤器 Scott Hansleman 的播客介绍了他们如何在 SO 中缓存内容 但我觉得我还没明白
  • 对基类模板成员函数的不明确访问

    在 Visual Studio 2008 中 编译器无法解析对SetCustomer in tmain下面并使其明确 template