5

Couple次の 2 つのコンストラクター シグネチャが与えられた場合、 withを構築することは可能Couple("George", "Nora")でしょうか? 私のコンパイラは、以下に示すエラーで文句を言います。私がそれを呼び出すと、Couple(std::string("George"), std::string("Nora"))コンパイルはOKです。char* から string への変換は問題ないと思うので、暗黙のキャストに問題があると思います。

class Person
{
    public:
        Person(const std::string& name);
};

class Couple
{
    public:
        Coordinate(const Person& p1, const Person& p2, const Optional<Person>& = Optional<Person>());
};

TestCouple.cpp:69: error: no matching function for call to `Couple::Couple(const char[7], const char[5])'
TestCouple.h:24: note: candidates are: Couple::Couple(const Person&, const Person&, const Optional<fox::Person>&)
4

3 に答える 3

12

実際、変換シーケンスには、暗黙的なユーザー定義の変換を複数含めることはできません。標準では、C++11 12.3/4 でこれを指定しています。

多くても 1 つのユーザー定義の変換 (コンストラクターまたは変換関数) が暗黙的に単一の値に適用されます。

あなたの場合、2つが必要になるため(char const[]to std::stringto Person)、暗黙的な変換はできません。

于 2012-06-25T11:57:05.717 に答える
6

暗黙の変換に問題があることは正しいです。値に対して 1 つの暗黙的な変換のみを行うため、たとえば、Couple(std::string("a"), std::string("b"))またはのいずれかを実行できますが、コンパイラは値ごとに 2 つの暗黙的な変換を行う必要があります。これは、コードを正しく理解するのが難しく、コンパイルに計算コストがかかる可能性があるため、標準では許可されていません。Couple(Person("a"), Person("b"))Couple("a", "b")

于 2012-06-25T11:55:47.567 に答える
1

チェーンされた暗黙的な変換は許可されていません。Aが に暗黙的に変換でき、 に暗黙的に変換できる場合、Bがに暗黙的に変換できるという意味ではありません。BCAC.

//given three objects as
A a;
B b'
C c;

//premises 
b = a; //a can convert into b (implicitly)
c = b; //b can convert into c (implicitly)

//then it does not follow this
c = a; //a CANNOT convert into c (implicitly)

//you need to write this at least
c = static_cast<B>(a); //ok
于 2012-06-25T11:56:27.630 に答える