By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,152 Members | 2,039 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,152 IT Pros & Developers. It's quick & easy.

Smart resource manager

P: n/a
I am trying to create an automatic resource manager that works very much
the same as std::auto_ptr. However, I have a compile error I cannot
figure out. The following program demonstrates the problem. Pretend,
in each case, that -1 means "no resource", and any other number is a
handle to a valid resource. The class releases the resource in the
destructor (similar to a std::auto_ptr calling delete), so any time a
copy of the class is made, ownership of the resource should be transferred.

class A
{
int s ;
public :
A() : s(-1)
{ }

A(int s) : s(s)
{ }

A(A &a) : s(a.s)
{
a.s = -1 ;
}

~A() throw()
{
// Do something to release resource.
s = -1 ;
}

A &operator=(A &a) throw()
{
s = a.s ;
a.s = -1 ;
return *this ;
}
} ;

A f()
{
A a(5) ;
return a ;
}

int main()
{
A a ;
a = f() ;
return 0 ;
}
Compling gives the following problem:
$ g++ -W -Wall -ansi -pedantic test.cpp
test.cpp: In function `int main()':
test.cpp:41: error: no match for 'operator=' in 'a = f()()'
test.cpp:25: error: candidates are: A& A::operator=(A&)

That is, the assignment fails, for some reason I cannot determine. Any
insight would be appreciated.

Thanks,
Alan
Jul 22 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
> A(int s) : s(s)

dont use "s" as your paramter name, use something other then the name of
your data member
likely, this is your problem.

-Chris
Jul 22 '05 #2

P: n/a
Alan Johnson wrote:
I am trying to create an automatic resource manager that works very
much
the same as std::auto_ptr. However, I have a compile error I cannot
figure out. The following program demonstrates the problem. Pretend,
in each case, that -1 means "no resource", and any other number is a
handle to a valid resource. The class releases the resource in the
destructor (similar to a std::auto_ptr calling delete), so any time a
copy of the class is made, ownership of the resource should be
transferred.

class A
{
int s ;
public :
A() : s(-1)
{ }

A(int s) : s(s)
{ }

A(A &a) : s(a.s)
{
a.s = -1 ;
}

~A() throw()
{
// Do something to release resource.
s = -1 ;
}

A &operator=(A &a) throw()
{
s = a.s ;
a.s = -1 ;
return *this ;
}
} ;

A f()
{
A a(5) ;
return a ;
}

int main()
{
A a ;
a = f() ;
return 0 ;
}
Compling gives the following problem:
$ g++ -W -Wall -ansi -pedantic test.cpp
test.cpp: In function `int main()':
test.cpp:41: error: no match for 'operator=' in 'a = f()()'
test.cpp:25: error: candidates are: A& A::operator=(A&)

That is, the assignment fails, for some reason I cannot determine.
Any insight would be appreciated.


Your programm is not const-correct. f() returns a temporary, and in C++,
you can't bind a non-const reference to a temporary. therefore, no
suitable operator= is found. Since your operator= actually needs to
modify the s member of the right hand side, you'd have to use the
mutable keyword for your member. Try this:

class A
{
mutable int s ;
public :
A() : s(-1)
{ }

A(int s) : s(s)
{ }

A(const A &a) : s(a.s)
{
a.s = -1 ;
}

~A() throw()
{
// Do something to release resource.
s = -1 ;
}

A &operator=(const A &a) throw()
{
s = a.s ;
a.s = -1 ;
return *this ;
}
} ;

Jul 22 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.