问题标签 [conversion-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2795 浏览

c++ - C++ 多重运算符=()

我正在写一个字符串类。我希望能够分配我的字符串,例如;

我已经为字符串到整数转换分配了我的 operator=() 方法。如何声明另一个 operator=() 以便我可以执行反向方法?

当我声明另一个时,它似乎覆盖了以前的。

0 投票
1 回答
279 浏览

c++ - 返回值和局部变量的区别

假设我有

std::string 构造函数可以采用 char* 或 std::string 引用,这就是赋值不明确的原因。但是为什么我的编译器(VC++10)抱怨第二个赋值而不是第一个呢?

我正在寻找一种方法来优先考虑模板转换运算符而不是重载的构造函数。

我收到以下错误:

0 投票
1 回答
71 浏览

c++ - 转换运算符在派生类中“仍然有效”是什么意思

我正在阅读“thinking in c++”第 14 章——不会自动继承的函数。上面的代码片段是 Eckel 给出的一个例子。埃克尔说:

“由于所有这些关于重写处理对象创建的函数的规则,自动类型转换运算符是继承的,乍一看似乎有点奇怪。但也不是太不合理——如果 Game 中有足够的碎片来制作一个 Other 对象,这些片段仍然存在于从 Game 派生的任何东西中,并且类型转换运算符仍然有效(即使您实际上可能想要重新定义它)。”

我不明白 Eckel 想说什么。谁能更详细地解释一下?

谢谢

0 投票
2 回答
1691 浏览

c++ - c ++如何为类的模板化转换运算符指定参数

我正在尝试为类的模板化转换运算符指定模板参数,但我似乎无法正确使用语法。

相同的代码在http://liveworkspace.org/code/35sqXe$4

使用 g++ 4.7.2 编译时

使用 g++ 4.8.0 编译时 (20130224)

使用 clang++ 3.2 编译时

使用 icc 13.0.1 编译时

除了警告之外, icc 似乎工作正常。

这些是编译器错误吗?还是我的语法有问题?

编辑

由于 Yakk 询问我的原始/实际问题是什么:
我有一个类 Ptr(以它指向的类型为模板),并且我想将 Ptr 转换为 const T。(尽管我知道在在这种情况下,)如果 T 已经是 const 类型,我希望转换运算符不存在。由于您没有为转换运算符指定返回类型或方法参数,因此我将 enable_if 作为方法模板参数的一部分。

正如 Yakk (以及其他问题中的其他人)所发布的那样, A simpletemplate <typename = typename std::enable_if<!std::is_const<T>::value>::type>不起作用,因为当 Ptr 被实例化时, T 在编译器到达此声明时就已经知道了。由于没有推导出 T,因此没有 SFINAE。因为我们知道!is_const<T>::value是假的,所以没有“类型”成员并且声明是无效的。使模板依赖于新类型 (U),推导出 U,然后检查 U 是否与 T 相同,并且 T 不是 const,然后具有无效声明是 SFINAE 的有效使用并且有效正如预期的那样。

但后来我对自己说,这是一个模板化的成员函数。这些模板参数不必保留为默认值,任何实例化该函数的人都可以指定它们。对于任何其他 operator xxx 函数,执行此操作的语法很明显并且有效(参见上面的 operator())。对于这个例子:

void(或任何其他类型)将指定转换运算符的第二个模板参数,并且不考虑包含 enable_if 的默认值。当我试图使它不存在时,这将使该方法存在。

但是 gcc、clang 和 msvc 似乎对这种语法有问题。我假设由于转换运算符是拼写的operator typename,因此具有模板参数会使编译器混淆,认为它们是用于类型名而不是运算符。

确实有一些解决方法(只包括转换运算符,当 T 已经是 const 时转换为 const T 不会有任何伤害),但这是针对这个特定问题的。也许不可能为转换运算符指定模板参数,所以让这些类型被推导/默认是好的。或者也许有它的语法(icc 似乎接受它......),所以我向指定模板参数和实例化我不想要它们的方法的用户开放自己。我已经有了针对我的特定问题的解决方案(在类型确实重要的时候,在转换运算符中的类型检查上使用 static_assert),但是这个问题是关于 C++ 语言及其语法的。顶部的 C 类只是我能想到的搜索该语法的最简单方法。

0 投票
1 回答
126 浏览

c++ - 如何让虚函数根据它所属的类返回不同类型,而不在 Base 中包含虚拟实现?

我需要一个类层次结构,其中派生类将实现一个返回类型不同的虚函数。我该怎么做。我尝试过的是以下代码:

我在想如果它可以以这种方式工作,用户只需将对象等同于一个有效变量。有没有办法在不包括 Base 中的所有转换运算符和一些虚拟实现的情况下做到这一点?

0 投票
2 回答
185 浏览

c# - C# 如何创建一个行为类似于 Nullable 的类

给定代码:

Nullable<T>new DateTime()可以直接赋值给变量。在我的课堂上,它不起作用。我想了解我错过了什么。

我认为这很简单。但我无法用语言来找到答案。

0 投票
5 回答
163 浏览

c++ - 如何将内置类型转换为用户定义类型

我有一个名为 BigInteger 的类,它支持大整数运算。我想在 BigInteger 和内置类型“int”之间实现混合操作。换句话说,我想支持以下陈述

我知道重载函数可以处理它

此外,我知道转换运算符只能处理它,

但是上面的函数支持将 BigInteger 转换为 int 会丢失精度。我正在寻找一些比重载函数更简单并保持精度的方法。

感谢大家。

我试试看

为什么我不能使用成员函数?这个怎么运作?

0 投票
1 回答
782 浏览

c++ - 涉及模板化转换运算符和隐式复制构造函数的歧义

clang 和 gcc 在以下代码的行为上有所不同:

这段代码被 clang 接受,foo(int)并调用了构造函数。但是,gcc 抱怨foo(int)构造函数与隐式生成的复制和移动构造函数之间存在歧义:

谁是对的?

有趣的是,如果foo f{w}更改为foo f(w)(注意从大括号更改为括号),gcc 和 clang 都会出错。这让我希望 gcc 对上述示例的行为(即给出错误)是正确的,否则初始化的(){}形式之间会出现奇怪的不一致。

编辑:按照Kerrek SB的建议,我尝试delete了复制构造函数foo

行为保持不变。

0 投票
1 回答
160 浏览

c++ - 转换运算符正在切片我的对象

我从以下代码中得到了意外的行为:

使用 MSVC2008,我在 main() 中得到这个编译错误:

为什么它试图访问 Base 的复制构造函数?

如果我公开 Base 的复制构造函数,代码会在运行时编译并切片返回值,并且在 func() 中对 foo() 的调用会触发一个名为 error 的纯虚函数。

有人可以解释一下吗?

0 投票
1 回答
120 浏览

c++ - 从 string 到 myclass 的自动转换

我已经定义了一个类

我希望能够按如下方式使用它

我希望 v1 成为一个对象,就像我已经完成了一样:

那可能吗?