[x-files][singleton] incomplete type problem

I ran into a compiler problem using the singleton library from the vault. singleton's constructor and destructor use instance_proxy before it is defined. The trivial fix is to make the definition of the constructor and destructor inline function at the bottom of the file (i.e. after instance_proxy is defined). singleton_manager.hpp causes warning under msvc 8.0 in the singleton_manager::cleanup function: warning C4706: assignment within conditional expression for while (!!(i = ptr_instance->ptr_first)) if this could be rewritten without much effort to silence the warning it would be nice. Nit - there seems to be a lot of extraneous inline keywords for functions defined inside the class definition. The library has proven quite useful. Thanks, Michael Marcin

Michael, Michael Marcin wrote:
I ran into a compiler problem using the singleton library from the vault.
singleton's constructor and destructor use instance_proxy before it is defined. The trivial fix is to make the definition of the constructor and destructor inline function at the bottom of the file (i.e. after instance_proxy is defined).
Actually, that shouldn't be a problem since 'singleton' is a template and things are complete once it's instantiated. Got some code that fails to compile?
singleton_manager.hpp causes warning under msvc 8.0 in the singleton_manager::cleanup function:
warning C4706: assignment within conditional expression
for
while (!!(i = ptr_instance->ptr_first))
if this could be rewritten without much effort to silence the warning it would be nice.
Yes (where interestingly the compiler could figure out this is not a typo here because of the '!!')... Maybe while ((i = ptr_instance->ptr_first) != 0l) will do the trick...
Nit - there seems to be a lot of extraneous inline keywords for functions defined inside the class definition.
...intentionally, because some compilers (under certain configurations) distinguish between "implicit" inline and "inline by keyword".
The library has proven quite useful.
Thanks for your feedback. Regards, Tobias

Tobias Schwinger wrote:
Michael,
Michael Marcin wrote:
I ran into a compiler problem using the singleton library from the vault.
singleton's constructor and destructor use instance_proxy before it is defined. The trivial fix is to make the definition of the constructor and destructor inline function at the bottom of the file (i.e. after instance_proxy is defined).
Actually, that shouldn't be a problem since 'singleton' is a template and things are complete once it's instantiated.
I think the compiler is allowed to check for an incomplete type before it is instantiated. I believe this is the same problem that fusion as_vector had a while ago. http://article.gmane.org/gmane.comp.lib.boost.devel/166502
Got some code that fails to compile?
Yes, #include <boost/utility/singleton.hpp>
singleton_manager.hpp causes warning under msvc 8.0 in the singleton_manager::cleanup function:
warning C4706: assignment within conditional expression
for
while (!!(i = ptr_instance->ptr_first))
if this could be rewritten without much effort to silence the warning it would be nice.
Yes (where interestingly the compiler could figure out this is not a typo here because of the '!!')...
Maybe
while ((i = ptr_instance->ptr_first) != 0l)
will do the trick...
That works, or context* i = ptr_instance->ptr_first; while ( i ) { context* next = i->ptr_next; i->fnc_dtor(i); i = ptr_instance->ptr_first = next; }
Nit - there seems to be a lot of extraneous inline keywords for functions defined inside the class definition.
...intentionally, because some compilers (under certain configurations) distinguish between "implicit" inline and "inline by keyword".
Hmm didn't expect that since the standard says its the same as declaring it inline just after the class's closing ';' IIRC. Out of curiosity do you remember what compilers do this? Thanks, Michael Marcin

Michael Marcin wrote:
Tobias Schwinger wrote:
Michael,
Michael Marcin wrote:
I ran into a compiler problem using the singleton library from the vault.
singleton's constructor and destructor use instance_proxy before it is defined. The trivial fix is to make the definition of the constructor and destructor inline function at the bottom of the file (i.e. after instance_proxy is defined). Actually, that shouldn't be a problem since 'singleton' is a template and things are complete once it's instantiated.
I think the compiler is allowed to check for an incomplete type before it is instantiated. I believe this is the same problem that fusion as_vector had a while ago.
http://article.gmane.org/gmane.comp.lib.boost.devel/166502
Got some code that fails to compile?
Yes,
#include <boost/utility/singleton.hpp>
OK, I'll just move the definitions - the code also becomes more readable this way.
Nit - there seems to be a lot of extraneous inline keywords for functions defined inside the class definition. ...intentionally, because some compilers (under certain configurations) distinguish between "implicit" inline and "inline by keyword".
Hmm didn't expect that since the standard says its the same as declaring it inline just after the class's closing ';' IIRC. Out of curiosity do you remember what compilers do this?
GCC's '-fno-default-inline' causes the compiler to stop inlining without keyword (won't affect linkage). BCC has a similar option, and I don't remember about MSVC but there might be more compilers that have. Regards, Tobias
participants (2)
-
Michael Marcin
-
Tobias Schwinger