Re: Odd error I can't seem to recreate
On 11/4/2011 4:07 PM, Noah Roberts wrote:
[.. seems that auto_ptr is to blame ..]
I recreated the problem:
cat wtf.cpp
#include<memory>
struct base
{
virtual ~base() {}
};
struct derived : base
{
std::auto_ptr<int> i;
derived() : i() {}
//private:
//derived(derived const&);
};
struct base;
struct base2
{
virtual ~base2() {}
virtual void fun(base const&) const = 0;
};
struct derived2 : base2
{
void fun(base const&) const {}
};
struct base3
{
virtual ~base3() {}
virtual std::auto_ptr<base2> get() const = 0;
};
struct derived3 : base3
{
std::auto_ptr<base2> get() const { return
std::auto_ptr<base2>(new derived2); }
};
int main()
{
derived3 d3;
std::auto_ptr<base2> b2 = d3.get();
b2->fun(derived());
}
Comeau online compiles it without even a blink. So does VC++ 2010 on my
machine.
Now I get all the errors I don't expect that are giving me crap in the
original code:
g++ wtf.cpp
wtf.cpp: In function ?int main()?:
wtf.cpp:42: error: no matching function for call to
?derived::derived(derived)?
wtf.cpp:9: note: candidates are: derived::derived(derived&)
Victor said:
So, 'test_service' copy constructor takes a non-const reference. To
initialize the argument to your 'run_query', a temporary of type
'location_service' has to be created (or has to be able to be
created),
and I am guessing there is no conversion that the compiler can use.
.................
As I understood it, because it takes a non-const reference the
temporary created by the "test_service()" call should be directly
used, rather than a copy of it attempted. Why is it necessary to make
a temporary of 'location_service', or 'base' in the above code?
I may just as well be wrong here.
So far I failed to reproduce your issue with another compiler. I don't
have access to gcc/g++ at this time.
Let's drop the auto_ptr member and try declaring our own copy-c-tor that
takes a non-const ref...
I've dropped the 'i' member from 'derived' and instead added a copy
c-tor with a non-const ref argument, both Comeau online and VC++ still
compiled it.
Something is funky with g++, I am guessing. Can it compile this:
struct base
{
virtual ~base() {}
};
struct derived : base
{
derived() : base() {}
derived(derived& d) : base(d) {}
};
void fun(base const& b) { return; }
int main()
{
derived d;
fun(d);
fun(derived());
}
?
V
--
I do not respond to top-posted replies, please don't ask