1

실패 다음 bar b = 3 라인 (g ++ -fstd=gnu++11와 4.7.1)에C =이 코드

class foo 
{ 
    int x; 
public: 
    foo(int x) : x(x) { } 
    int get() const { return x; } 
    //... 
}; 

class bar 
{ 
    int x; 
public: 
    bar(const foo& x) : x(x.get()) { } 
    int get() const { return x; } 
    bar& operator =(const foo& rhs) { x = rhs.get(); return *this; } 
    //... 
}; 

void func() 
{ 
    foo f = 3; 
    bar b = 3; 
    b = 7; 
    //... 
} 

오류 아웃 : 그러나

error: conversion from 'int' to non-scalar type 'bar' requested 

, 나는 제공하고 있습니다 foo을 취하는 bar 생성자와 ints는 앞에 선으로 표시된 것처럼 암시 적으로 foo으로 변환 될 수 있습니다. 그래서, 무엇이 잘못 될까요?

덧붙여서, 몇 가지 이유 때문에 을 사용하여 foo으로 강제 변환하는 것은 바람직하지 않습니다. 실제 코드를 사용하고 읽지 못하게하기 때문입니다.

+4

C++에서는 둘 이상의 사용자 정의 변환과 관련된 암시 적 변환 경로를 허용하지 않습니다. –

+0

@ n.m .: That is an _answer_ :) –

답변

5

I'm providing a bar constructor that takes a foo, and ints can be implicitly converted to foo as shown by the line preceding it. So, what is going wrong?

체인화 된 변환은 (체인) 변환이 발생 할 수 없음을 의미하는 C++에서 허용되지 않습니다 :

int -> foo -> bar //not allowed (chained conversion) 

다음과 주어진 경우에도 : 그래서

int -> foo //given 
foo -> bar //given 

당신이 경우 int -> bar이 작동하도록하려면 int 인 다른 생성자를 클래스 bar에 추가하십시오.

+0

할당이 모호하지 않도록 오버로드를 추가해야한다고 생각합니다. – fincs

+0

@fincs :'bar (int)'를 추가하면'operator = (int)'를 추가 할 필요가 없습니다. – Nawaz

+0

예, 컴파일러가 불평합니다 :'error : \'operator = \'in \'b = 7 \''에 대한 모호한 오버로드. – fincs

0

암시 사용자 정의 변환 시퀀스에 대한 위임 § 13.3.3.1.2/1 :

A user-defined conversion sequence consists of an initial standard conversion sequence followed by a user defined conversion (12.3) followed by a second standard conversion sequence. If the user-defined conversion is specified by a constructor (12.3.1), the initial standard conversion sequence converts the source type to the type required by the argument of the constructor. If the user-defined conversion is specified by a conversion function (12.3.2), the initial standard conversion sequence converts the source type to the implicit object parameter of the conversion function.

이것은 사용자가 정의하는 변환 이상 체인 불가능을 의미한다.