标签: implicit-conversion

重载运算符中没有隐式转换

d1 + 4工作原理,但4 + d1并不即使4可隐式转换为GMAN.为什么它们不相同?

struct GMan
{
    int a, b;

    GMan() : a(), b() {}
    GMan(int _a) : a(_a), b() {}
    GMan(int _a, int _b) : a(_a), b(_b) {}

    GMan operator +(const GMan& _b)
    {
         GMan d;
         d.a = this->a + _b.a;
         d.b = this->b + _b.b;
         return d;
    }
};

int main()
{
    GMan d1(1, 2), d(2);
    GMan d3;
    d3 = d1 + 4; 
    d3 = 4 + d1;
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading implicit-conversion

10
推荐指数
1
解决办法
777
查看次数

在Scala中,如何为Java中定义的类定义伴随对象?

我想将隐式转换添加到由建模工具生成的Java类中.所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们.但我无法将它们添加到单独的文件中,因为必须在同一文件中定义随播广告.我能做些什么吗?

当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外的导入.还有其他方法吗?

scala implicit-conversion scala-java-interop companion-object

10
推荐指数
2
解决办法
2227
查看次数

隐式转换和显式转换之间的区别

可能重复:
隐式VS显式转换

"隐式转换"和"显式转换"之间有什么区别?Java和C++的区别是什么?

c++ java implicit-conversion explicit-conversion

10
推荐指数
1
解决办法
7万
查看次数

为什么编译器在重载的非模板函数上选择此模板函数?

使用VC++ 2010,给出以下内容:

class Base { };
class Derived : public Base { };

template<class T> void foo(T& t);  // A
void foo(Base& base);              // B

Derived d;
foo(d);                            // calls A
foo(static_cast<Base&>(d));        // calls B
Run Code Online (Sandbox Code Playgroud)

我想在上面调用"B".我可以用演员来实现这一点Base,但为什么这是必要的?

我希望为所有不是从Base(内置类型等)派生的类型调用模板函数,但我希望从派生类型调用非模板重载Base,而不需要客户端显式转换.我也尝试使重载成为模板的特化,但在这种情况下会发生相同的行为.得到我正在寻找的东西的惯用方法是什么?

c++ templates overloading type-constraints implicit-conversion

10
推荐指数
1
解决办法
415
查看次数

Scala:是否可以指出实现某种方法的泛型类

我认为通过一个简单的例子来解释它更容易.(欢迎帮助改写标题;-)

我想实现一个squared方法,并使用implicit def,自动将其添加到任何支持*-operator的类.

使用Int非常容易:

class EnhancedInt(x: Int) { def squared = x * x }

implicit def IntToEnchancedInt(x: Int) = new EnhancedInt(x)
Run Code Online (Sandbox Code Playgroud)

但是对于Any或AnyVal,我收到以下错误:

scala> class EnhanceAny(x: AnyVal) { def squared = x * x }
<console>:7: error: value * is not a member of AnyVal
       class EnhanceAny(x: AnyVal) { def squared = x * x }
Run Code Online (Sandbox Code Playgroud)

我想知道如何将它应用于任何数字类,或者甚至更好地应用于任何支持*-operator的类.

generics scala implicit-conversion

10
推荐指数
1
解决办法
812
查看次数

隐式运算符应该处理null吗?

我们有一个具有隐式字符串运算符的类型.它看起来像这样:

public class Foo
{
    readonly string _value;

    Foo(string value)
    {
        _value = value;
    }

    public static implicit operator string(Foo foo)
    {
        return foo._value;
    }

    public static implicit operator Foo(string fooAsText)
    {
        return new Foo(fooAsText);
    }

}
Run Code Online (Sandbox Code Playgroud)

我们刚刚有一个实例传递给隐式运算符null的场景.显然,我们最终得到了一个NullReferenceException.

我认为这是很公平的,毕竟,什么是一个类型,它是空的字符串表示 - 很难说 - 这样的例外似乎是有效的,这是我们不应该拦截/禁止/手柄/忽略.我的理由是'有人给我一个空的,为什么我应该返回null.我不会在其他方法中这样做.我想,'我知道,我会在转换之前检查null',类似于:

string s = foo == null ? null : foo;

但这没有用,因为它现在在比较之前转换为字符串为null.当然,这种比较可行:

Foo f = null;
string s;
if (f != null)
{
    s = f;
}
Run Code Online (Sandbox Code Playgroud)

......但那只是丑陋的.

我阅读了Essential …

c# exception-handling implicit-conversion

10
推荐指数
2
解决办法
2365
查看次数

为什么>> 24导致-Wconversion但是>> 23不?

这是代码:

#include <stdint.h>

unsigned char f(uint32_t RGBA)
{
  return (RGBA>>24) & 0xFF;
}
Run Code Online (Sandbox Code Playgroud)

当使用-Wconversion它编译导致"警告:从'uint32_t {aka unsigned int}'转换为'unsigned char''可能会改变其值[-Wconversion]".如果我将移位值降低到23或更低,则警告消失.

我查看了C99标准,我不明白这里发生了什么.如果我删除了&运算符,那么总是会发出警告,这可能是好的,因为表达式(在整数提升之后)的结果大于unsigned char.我唯一的想法是,对于较小的班次省略警告只是因为gcc是聪明的并且看到结果仍然是8位,因为标准不会使这成为特殊情况.我在这儿吗?

为什么班次价值很重要?这是GCC的错误吗?Clang似乎没有为任何班次值产生警告.

我在64位Linux系统上使用GCC 5.3.1.

c gcc compiler-warnings implicit-conversion

10
推荐指数
1
解决办法
213
查看次数

为什么这个operator = call不明确?

我正在使用转发构造函数创建一个瘦派生类.(请耐心等待,我必须使用缺少继承构造函数的GCC 4.7.2).

在第一次尝试时,我忘了添加explicit关键字并出错.有人可以解释为什么会发生这种特殊错误吗?我无法搞清楚事件的顺序.

#include <memory>

template<typename T>
struct shared_ptr : std::shared_ptr<T>
{
  template<typename...Args>
  /*explicit*/ shared_ptr(Args &&... args)
    : std::shared_ptr<T>(std::forward<Args>(args)...)
  {}
};

struct A {};

struct ConvertsToPtr
{
  shared_ptr<A> ptr = shared_ptr<A>(new A());
  operator shared_ptr<A> const &() const { return ptr; }
};

int main()
{
  shared_ptr<A> ptr;
  ptr = ConvertsToPtr(); // error here
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

test.cpp: In function ‘int main()’:
test.cpp:28:23: error: ambiguous overload for ‘operator=’ in ‘ptr = ConvertsToPtr()’
test.cpp:28:23: note: candidates are:
test.cpp:9:8: note: …
Run Code Online (Sandbox Code Playgroud)

c++ explicit implicit-conversion c++11

10
推荐指数
1
解决办法
530
查看次数

将指向typed/size enum的指针转换为指向底层类型的指针是否安全?

以下代码:

void f(const uint8_t* a) {}  // <- this is an external library function
enum E : uint8_t { X, Y, Z };

int main(void) {
  E e = X;
  f(&e);  // <- error here
}
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

/tmp/c.cc:10:3: error: no matching function for call to 'f'
  f(&e);
  ^
/tmp/c.cc:5:6: note: candidate function not viable: no known conversion from 'E *' to 'const uint8_t *' (aka 'const unsigned char *') for 1st argument
void f(const uint8_t* e) { }
Run Code Online (Sandbox Code Playgroud)

这对我来说是令人惊讶的,因为我认为: …

c++ enums pointers implicit-conversion c++11

10
推荐指数
2
解决办法
608
查看次数

为什么在(* x).into()中需要显式取消引用,而在x.my_into()中却不需要?

在阅读了方法调用表达式解引用运算符方法查找自动解引用之后,我认为我对该主题有了很好的理解。但是后来我遇到了一种情况,我希望自动重新引用会发生,而实际上却没有发生。

示例如下。

#[derive(Clone, Copy, Debug)]
struct Foo();

impl Into<&'static str> for Foo {
    fn into(self) -> &'static str {
        "<Foo as Into>::into"
    }
}

fn vec_into<F: Copy + Into<T>, T>(slice: &[F]) -> Vec<T> {
    slice.iter().map(|x| (*x).into()).collect()
}

fn main() {
    let array = [Foo(), Foo(), Foo()];
    let vec = vec_into::<_, &'static str>(&array);
    println!("{:?}", vec);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码有效,但是我认为不需要(*x).into()在函数中vec_into进行显式取消引用。我的理由是,因为x: &Foo,然后x.into()就试图找到接受类型的方法&Foo&&Foo&mut &Foo, …

traits dereference implicit-conversion rust

10
推荐指数
1
解决办法
151
查看次数