Ошибка "Вызов конструктора" неоднозначен ", хотя параметры конструктора класса не выглядят одинаково? - PullRequest
4 голосов
/ 05 августа 2020

Появляется сообщение об ошибке Call to constructor of 'Binary' is ambiguous, это сообщение об ошибке появляется только при использовании компилятора LLVM в macOS, но на windows оно не появляется. Кроме того, параметры конструктора класса не выглядят одинаково.

class Binary {
public:
    Binary() = default;
    Binary(uintmax_t containerSize);
    Binary(unsigned char binary);
    Binary(std::initializer_list<unsigned char> binaryList);
    // .....
};

// When using
// fileSize is `std::streamoff` data type
Binary fileContent((unsigned long long)fileSize)  // << This line is causing the problem.

Что не так с моим классом?

1 Ответ

4 голосов
/ 05 августа 2020

uintmax_t - это typedef для целочисленного типа без знака максимальной ширины на вашем компьютере. При компиляции кода, если этот тип не точно unsigned long long, тогда этот вызов:

Binary fileContent((unsigned long long)fileSize); 

неоднозначен, поскольку аргумент должен быть меньше go ровно одно преобразование чтобы соответствовать одному из этих конструкторов:

Binary(uintmax_t containerSize); // conversion from unsigned long long to uintmax_t needed
Binary(unsigned char binary);    // conversion from unsigned long long to unsigned char needed

, и компилятор не может выбрать между ними, и возникает ошибка.

Если uintmax_t оказывается точно unsigned long long, то 1-й конструктор является точным совпадением, выбирается, и программа компилируется. Предположительно, это разница между версией компилятора macOS и Windows, которую вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...