gpt4 book ai didi

c++ - 显式转换和模板化转换运算符

转载 作者:太空宇宙 更新时间:2023-11-04 12:15:10 25 4
gpt4 key购买 nike

我想以某种方式扩展 Microsoft 类型 _variant_t因此它接受与其他类型之间的隐式/显式转换。为此,我编写了以下类:

class value_type
{
public:
/* Constructors */
value_type(const std::string& str) : m_variant(str.c_str()) {}
template <typename Type> value_type(const Type& value) : m_variant(value) {}

/* Conversion operators */
operator const _variant_t&() const { return m_variant; }
operator std::string() const { return static_cast<const char*>(m_variant); }
template <typename Type> operator Type() const { return static_cast<Type>(m_variant); }
private:
_variant_t m_variant;
};

也就是说,如果 _variant_t 的每个实例代码中替换为value_type ,它“工作”是一样的。

让我们考虑以下函数,它返回一个 _variant_t :

_variant_t foo();

如果我写:

std::string bar()
{
value_type v = foo();
return v;
}

它编译得很好。

但是如果我像这样更改之前的代码:

std::string bar()
{
return value_type(foo());
}

或:

std::string bar()
{
return static_cast<std::string>(value_type(foo()));
}

编译失败并显示以下消息:

configuration.cpp(41) : error C2668: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string' : ambiguous call to overloaded function

如果我删除 template <typename Type> operator Type...行,一切编译。

现在我明白了编译器说的是什么(它不知道要使用哪个运算符)但我不明白为什么:使用 operator std::string 似乎是合乎逻辑的转换为 std::string 时.我错过了什么?

谢谢。

最佳答案

问题是字符串的构造函数被重载了。因此,如果返回涉及调用字符串构造函数,则有多种选择:参数可以转换为 const char* , allocator<char>string .

static_cast<string>(x)string(x)相同.

我想你的第一个错误示例应该是 return string(foo()); , 不是 return value_type(foo());

关于c++ - 显式转换和模板化转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8079749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com