From: Warren Young Date: April 3 2008 11:11pm Subject: Re: conversion from =?UTF-8?B?4oCYbXlzcWxwcDo6UXVlcnnigJkgdG8g4oCY?= =?UTF-8?B?Ym9vbOKAmSBpcyBhbWJpZ3VvdXM=?= List-Archive: http://lists.mysql.com/plusplus/7563 Message-Id: <47F56438.2030401@etr-usa.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Dustin Moore wrote: > ../DataInterface/DataInterface.cpp:100: error: conversion from > ‘mysqlpp::Query’ to ‘bool’ is ambiguous > /usr/local/include/mysql++/query.h:257: note: candidates are: > mysqlpp::Query::operator bool mysqlpp::Query::*() const > /usr/include/c++/4.1.3/bits/basic_ios.h:107: note: > std::basic_ios<_CharT, _Traits>::operator void*() const [with _CharT = > char, _Traits = std::char_traits] Well, this bug slipped through because what you're trying to do isn't idiomatic MySQL++. The standard way to test for query success is to test the execute() (or store(), or use(), or...) statement in bool context. Or, use exceptions. See the examples. Nevertheless, it does need to be addressed. We have two options: 1. Avoid breaking the ABI by putting Query::success() back (maybe with a different name), it being an alias for the current bool conversion. 2. Remove the current bool conversion operator, and override basic_ios<>::operator void*() instead. This breaks the ABI and ignores warnings set down in the "safe bool" article that motivated adding this method to begin with. But, if the "right way" doesn't work, and this does... I said I didn't want to break the ABI again, but it's still not long after the initial release, and it's a real design flaw. Comments, anyone? > As a side note, I tried to use query.affected_rows() to determine a > successful update, but the function returned a very large > number(garbage) instead of -1 or 0, which would make more sense in > context. Works here. Query::affected_rows() is a pretty thin wrapper over the C API: there are some indirections before you get down to the C API, but the number the C API returns is coming through untouched. Can you modify one of the examples to show the problem? I did it for examples/ssqls2.cpp, putting the call between the execute() and print_stock_rows() calls, and got 1, as expected.