функция перегрузки c ++, включая аргументы bool и integer - PullRequest
0 голосов
/ 14 марта 2020

простой и, я думаю, простой ответ на вопрос (если я сам его еще не получил). Следующие перегруженные функции:

void BR(const bool set) { backwardReaction_[nReac_] = set; }
bool BR(const int reactionNumber) const { return backwardReaction_[reactionNumber]; }

Первая функция - функция установки, а вторая - функция получения. backwardReaction_ относится к типу std::vector<bool>. Проблема возникает всякий раз, когда я хочу вызвать вторую функцию. Здесь я получаю ошибку компилятора overload function BR(xy) ambigious.

int main()
.
.
const int i = 3;
bool a = chem.BR(i);

Ошибка компилятора равна:

chemistryTestProg.cpp: In function ‘int main()’:
chemistryTestProg.cpp:74:34: error: call of overloaded ‘BR(const int&)’ is ambiguous
     const bool a = chem.BR(i);
                             ^
In file included from ../../src/gcc/lnInclude/chemistryCalc.hpp:38:0,
                 from ../../src/gcc/lnInclude/chemistry.hpp:38,
                 from chemistryTestProg.cpp:35:
../../src/gcc/lnInclude/chemistryData.hpp:266:18: note: candidate: void AFC::ChemistryData::BR(bool)
             void BR(const bool);
                  ^~
../../src/gcc/lnInclude/chemistryData.hpp:322:22: note: candidate: bool AFC::ChemistryData::BR(int) const
                 bool BR(const int) const;
                      ^~

Я думаю, что я получаю проблему из-за типов bool и int, которые идентичны (true => int(1), false => int(0). Поскольку я меняю имя получателя на, например, bool getBR(const int reactionNumber) {...}, все работает нормально. Поэтому я думаю, что проблема заключается в сходстве обработки bool и int в c ++ Я также пробовал различные вызовы, такие как:

const bool a = chem.BR(4)
const bool a = chem.BR(int(5))
const bool a = chem.BR(static_cast<const int>(2))
bool a = chem.BR(...)

Таким образом, я думаю, что это действительно связано с перегрузкой аргументов bool и int. Тем не менее, я сделал быстрый поиск и сделал не находите слишком много об этих двух типах перегрузки и возникающих проблемах. Tobi

1 Ответ

1 голос
/ 14 марта 2020

Это потому, что вы объявили BR(int), но не BR(bool), как const. Затем, когда вы вызываете BR(int) для неконстантного объекта, у компилятора есть два противоречивых правила сопоставления: сопоставление параметров благоприятствует BR(int), но сопоставление const -ness благоприятствует BR(bool).

...