- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Item
可以携带多种类型数据的类,包括 std::map<Item, Item>
.我定义了 operator[]
执行以下操作:如果 Item 不是 V_MAP 类型(V_MAP 是我指定携带类型的枚举的一部分),Item 将其类型更改为 V_MAP。在这个“类型转换”之后,它返回 internalMap [ ItemPassedAsArgument ]
.运营商有以下声明:
Item& operator[] (const Item& itemArg);
它工作正常,我已经通过各种方式进行了测试。
现在,这需要与其他一些东西集成,首先是 ClassX。
ClassX 有一个 Item(V_MAP) 类型的成员。它需要容纳东西。它(ClassX)还有一个成员方法定义如下:
std::string ClassX::getSmth () const {
return item[keySmth];
}
keySmth 在哪里
const std::string ClassX::keySmth ("blablabla");
我不允许更改 getSmth()
的定义方法。那个 const 需要留在那里,那个方法应该只检查东西。
如您所见,该方法无法更改任何内容,因此与我的运算符相矛盾。像这样使用时,错误显示 No operator[] matches these operands.Operands are const Item [ const std::string ]
.因此,我重载了 operator[]
做几乎相同的事情,除了它改变 Item
类型的部分, 并返回一个常量 Item
.这是它的声明:
const Item& operator[] (const Item& itemArg) const;
现在由程序员来确保下标运算符现在仅应用于 Item
V_MAP 类型的 s。
但现在我得到以下编译器错误:
error C2668: 'std::basic_string<_Elem,_Traits,_Alloc>::basic_string' : ambiguous call to overloaded function
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>
]
c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(896): could be 'std::basic_string<_Elem,_Traits,_Alloc>::basic_string(std::basic_string<_Elem,_Traits,_Alloc> &&) throw()'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>
]
c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(789): or 'std::basic_string<_Elem,_Traits,_Alloc>::basic_string(const _Elem *)'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>
]
while trying to match the argument list '(const Item)'
问题出在哪里?谢谢
编辑:这是 std::string 的构造函数:
Item(const std::string str_value) {
m_data = new Data<std::string> (str_value);
m_type = V_STR;
}
std::string
来自 Item
:
template<typename T>
operator T () const {
//Check
if (this->m_data == nullptr)
return NULL;
// dynamic_cast m_data to point to "an Item of type T"
Data<T>* temp_data = dynamic_cast<Data<T>* > (m_data);
return temp_data->m_dataOfAnyType;
}
最佳答案
这是模棱两可的原因是你的转换运算符,它可以将 Item
转换成任何东西(至少在这里你应该注意到这是 super 模棱两可的)。
std::string
可以通过复制构造函数或使用 char 指针构造(两者都只有 1 个参数,还有一些构造函数,但这些与此无关)。在这种情况下,编译器不知道他是否应该将 Item
对象转换为 char*
或 std::string
以便构造一个字符串(请注意,当您按值返回时,会创建一个临时字符串)。
我会建议您摆脱那个强制转换操作符,我觉得它很老套,而且我确信这只是该方法会出现的众多问题之一。定义混凝土浇铸。
如果您想保留该运算符,另一种可能性是定义一个 toString()
方法,它比 IMO 中的隐式转换更清晰。
第三种可能性是显式转换您的Item
。然后你可以写:
return (std::string) item;
// or
return (char*) item;
关于c++ - MSVS 2012 "ambiguous call to overloaded function"中的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246950/
我们有 50 多个项目,分为由 TFS 管理的 2 个解决方案树(版本:Visual Studio 2008/TFS RTM (9.0.21022.8))。 30 多个项目是 Visual Studi
我尝试将预构建的 Qt 二进制文件用于 MSVS 2008 和 MSVS 2010。(没有用于 MSVS 2010 的预构建二进制文件。) 这适用于发布版本,但对于调试版本,我的 Qt 应用程序无法启
我在 MSVS 2010 中有一个 MFC 项目。当我编译它时,MSVS 生成包含以下行的 list 文件: 因此,我得到一个二进制文件,它依赖于 MSVS 2008 的 vcredist_x86.
安装 MSVS 11Beta 后,我的 MSVS 10 遇到了编译问题。现在,当我在 MSVS 10 中编译我的 C# 项目时(在 MSVS 10 中创建的项目;目标框架:3.5),出现错误 MSB4
我有一个项目在 MSVS 2010 SP1 下运行良好。我正在尝试将其转换为 MSVS 2012 RC。我不得不更改一些内容,主要与 C++ header /lib 路径和 MFC 自定义内容有关。但
我正在查看由 msvs 2008 链接器生成的可执行文件中的数据部分,我发现它在常量静态字符串之间插入了某种标记: 我查看了其他几个可执行文件,发现了相同的模式。实际字节值虽然不同,但仍插入字符串之间
#include "hmap.h" int main(char* argv[], int argc) { printf("%s", argv[0]); <---- fails here
我正在寻找一个简单的工具,它接受路径、扫描文件夹并创建包含所有找到的项目的解决方案 (sln) 文件。 自动设置项目依赖项对我来说是该工具的一大优势。 我知道写这个东西很简单,但一定有很多“小 hel
我要执行以下操作: 使用MSVS 2015 IDE构建检测的PGO exe 将生成的exe及其.pgd文件复制到其他几台计算机 在这些计算机上从命令行运行exe。请注意,这些计算机上没有MSVS编译器
我按照此处的说明操作 How to create and use resources in .NET 但是当我执行 Properties.Resources.Name;我收到“当前上下文中不存在名称‘
我正在编写一些应该将 Eigen::Array 作为输入的函数。数组的大小不变,但大小是模板参数,应从输入中扣除。使用 MSVS 编译时,我必须为函数提供大小,否则会导致错误。 #include t
前一段时间,这个question被问到,关于熟悉的 error: 'static' can only be specified inside the class definition 错误。 在我当前
虽然增量链接解决了花费在链接上的大部分时间,即使对于非常大的项目,我发现 MSVS 中的增量链接器非常随意。 (我目前正在使用 2003 atm,很想知道 2005/8 是否解决了这些问题。)我的已知
我的代码是在 MSVS 2013 的某些平台和 MSVS 2010 的其他平台上编译的(更不用说 UNIX 和 VMS)。由于 MSVS 2010 不支持语句后的声明(如 “weird-compila
我想创建一个将消息映射到默认处理器的编译时结构,但我的代码无法在 msvs 2015 update2 中编译。我认为这是编译器中的一个错误,因为代码非常合法并且可以使用 gcc 进行编译。您可以在下面
我在程序中某处调用以下函数会抛出异常 public static List LoadTemplates() { // ... // System.Threading.Thread.Cu
用_Check_return_注释函数的正确方法是什么? 在以下示例中,静态分析器只产生一个警告而不是两个: _Check_return_ int foo() { return 42; } _
在处理 Windows API 时,我试图通过替换两行代码来使我的代码不那么臃肿 TEMP t{0,1,2}; // let's say it's struct TEMP {int a; int b;
我最近一直忙于为我一直在设计的代码库制作正确的构建脚本,并且一直致力于让 MSBuild 为我的 Windows 构建正确编译。我想要做的是从批处理脚本中调用 MSBuild 而无需打开 Visual
我已尝试阅读所有我能找到的似乎适用于我的代码的链接器错误,但我还没有找到解决方案,因此非常感谢您的帮助。从我读过的内容来看,链接器错误似乎适用于我的代码的唯一原因是声明/定义不匹配,因为它之前工作正常
我是一名优秀的程序员,十分优秀!