Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > "expected constructor, destructor, or type conversion before '->' token" using a Singleton

Reply
Thread Tools

"expected constructor, destructor, or type conversion before '->' token" using a Singleton

 
 
Damien
Guest
Posts: n/a
 
      12-12-2006
Hi all,

I'm using a pretty standard C++ Singleton class, as below:

template <typename T>
class Singleton
{
public:
static T* Instance()
{
static T instance_;
return &instance_;
}

private:
Singleton(); // ctor hidden
~Singleton(); // dtor hidden
Singleton(Singleton const&); // copy ctor hidden
Singleton& operator=(Singleton const&); // assign op hidden
};

Trying to use it on something really simple is giving me headaches:

class DoIt
{
public:
DoIt(){}
~DoIt(){}

void DoSomething(){}
};

int main()
{
DoIt* doit = Singleton<DoIt>::Instance();
doit->DoSomething();
}

I get the compiler error "error: expected constructor, destructor, or
type conversion before '->' token" on the doit->DoSomething(); line. I
can't see how doit can be name-dependent because there's no typedef'ing
associated with it inside the Singleton, unless the static has
something to do with it. Anyone got any ideas?

Damien

 
Reply With Quote
 
 
 
 
Ivan Vecerina
Guest
Posts: n/a
 
      12-12-2006
"Damien" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) oups.com...
: I'm using a pretty standard C++ Singleton class, as below:
:
: template <typename T>
: class Singleton
: {
: public:
: static T* Instance()
: {
: static T instance_;
: return &instance_;
: }
:
: private:
: Singleton(); // ctor hidden
: ~Singleton(); // dtor hidden
: Singleton(Singleton const&); // copy ctor hidden
: Singleton& operator=(Singleton const&); // assign op hidden
: };
:
: Trying to use it on something really simple is giving me headaches:
:
: class DoIt
: {
: public:
: DoIt(){}
: ~DoIt(){}
:
: void DoSomething(){}
: };
:
: int main()
: {
: DoIt* doit = Singleton<DoIt>::Instance();
: doit->DoSomething();
: }
:
: I get the compiler error "error: expected constructor, destructor, or
: type conversion before '->' token" on the doit->DoSomething(); line.
I
: can't see how doit can be name-dependent because there's no
typedef'ing
: associated with it inside the Singleton, unless the static has
: something to do with it. Anyone got any ideas?
Well, the code you posted compiles "as is" in both Comeau and VC8.1.
However, the design of your singleton seems weird to me (was it an
artificial example posted for demonstration purposes?), and it does
not prevent the creation of additional DoIt instances.

Your "Singleton" class could be replaced with a single function:
template<class T>
T& single_instance() { static T instance; return instance; }

Usage:
int main()
{
DoIt& doit = single_instance<DoIt>();
doit.DoSomething();
}

An online search will probably bring a few existing singleton
implementations, up to Andrei Alexandrescu's policy-based design.
But if the 'static function member' does what you need, I personally
wouldn't bother using a Singleton template to implement it.

hth -Ivan
--
http://ivan.vecerina.com/contact/?subject=NG_POST <- email contact form
Brainbench MVP for C++ <> http://www.brainbench.com


 
Reply With Quote
 
 
 
 
eriwik@student.chalmers.se
Guest
Posts: n/a
 
      12-12-2006
On Dec 12, 7:29 am, "Damien" <(E-Mail Removed)> wrote:
> Hi all,
>
> I'm using a pretty standard C++ Singleton class, as below:
>
> template <typename T>
> class Singleton
> {
> public:
> static T* Instance()
> {
> static T instance_;
> return &instance_;
> }
>
> private:
> Singleton(); // ctor hidden
> ~Singleton(); // dtor hidden
> Singleton(Singleton const&); // copy ctor hidden
> Singleton& operator=(Singleton const&); // assign op hidden
> };
>
> Trying to use it on something really simple is giving me headaches:
>
> class DoIt
> {
> public:
> DoIt(){}
> ~DoIt(){}
>
> void DoSomething(){}
> };
>
> int main()
> {
> DoIt* doit = Singleton<DoIt>::Instance();
> doit->DoSomething();
> }
>
> I get the compiler error "error: expected constructor, destructor, or
> type conversion before '->' token" on the doit->DoSomething(); line. I
> can't see how doit can be name-dependent because there's no typedef'ing
> associated with it inside the Singleton, unless the static has
> something to do with it. Anyone got any ideas?


You sure this is the code you are trying to compile? It works fine for
me both in VC8 and Comeau Online.

--
Erik Wikström

 
Reply With Quote
 
Damien
Guest
Posts: n/a
 
      12-12-2006
I should have said the compiler is gcc 4.1.1. I know it's not a
perfect Singleton design, it's the error message I want to understand.

DAmien

On Dec 12, 12:30 am, "(E-Mail Removed)"
<(E-Mail Removed)> wrote:
> On Dec 12, 7:29 am, "Damien" <(E-Mail Removed)> wrote:
>
>
>
> > Hi all,

>
> > I'm using a pretty standard C++ Singleton class, as below:

>
> > template <typename T>
> > class Singleton
> > {
> > public:
> > static T* Instance()
> > {
> > static T instance_;
> > return &instance_;
> > }

>
> > private:
> > Singleton(); // ctor hidden
> > ~Singleton(); // dtor hidden
> > Singleton(Singleton const&); // copy ctor hidden
> > Singleton& operator=(Singleton const&); // assign op hidden
> > };

>
> > Trying to use it on something really simple is giving me headaches:

>
> > class DoIt
> > {
> > public:
> > DoIt(){}
> > ~DoIt(){}

>
> > void DoSomething(){}
> > };

>
> > int main()
> > {
> > DoIt* doit = Singleton<DoIt>::Instance();
> > doit->DoSomething();
> > }

>
> > I get the compiler error "error: expected constructor, destructor, or
> > type conversion before '->' token" on the doit->DoSomething(); line. I
> > can't see how doit can be name-dependent because there's no typedef'ing
> > associated with it inside the Singleton, unless the static has
> > something to do with it. Anyone got any ideas?You sure this is the code you are trying to compile? It works fine for

> me both in VC8 and Comeau Online.
>
> --
> Erik Wikström


 
Reply With Quote
 
Lionel B
Guest
Posts: n/a
 
      12-12-2006
On Tue, 12 Dec 2006 06:11:22 -0800, Damien wrote:

(Please don't top-post)

> On Dec 12, 12:30 am, "(E-Mail Removed)"
> <(E-Mail Removed)> wrote:
>> On Dec 12, 7:29 am, "Damien" <(E-Mail Removed)> wrote:
>>
>>
>> > Hi all,

>>
>> > I'm using a pretty standard C++ Singleton class, as below:

>>
>> > template <typename T>
>> > class Singleton
>> > {
>> > public:
>> > static T* Instance()
>> > {
>> > static T instance_;
>> > return &instance_;
>> > }

>>
>> > private:
>> > Singleton(); // ctor hidden
>> > ~Singleton(); // dtor hidden
>> > Singleton(Singleton const&); // copy ctor hidden
>> > Singleton& operator=(Singleton const&); // assign op hidden
>> > };

>>
>> > Trying to use it on something really simple is giving me headaches:

>>
>> > class DoIt
>> > {
>> > public:
>> > DoIt(){}
>> > ~DoIt(){}

>>
>> > void DoSomething(){}
>> > };

>>
>> > int main()
>> > {
>> > DoIt* doit = Singleton<DoIt>::Instance();
>> > doit->DoSomething();
>> > }

>>
>> > I get the compiler error "error: expected constructor, destructor, or
>> > type conversion before '->' token" on the doit->DoSomething(); line. I
>> > can't see how doit can be name-dependent because there's no typedef'ing
>> > associated with it inside the Singleton, unless the static has
>> > something to do with it. Anyone got any ideas?

>>
>> You sure this is the code you are trying to compile? It works fine for
>> me both in VC8 and Comeau Online.

>
> I should have said the compiler is gcc 4.1.1. I know it's not a perfect
> Singleton design, it's the error message I want to understand.


Compiles ok for me here on gcc 4.1.1 (linux x86_64). Sure there's not
something you're not telling us?

--
Lionel B
 
Reply With Quote
 
Damien
Guest
Posts: n/a
 
      12-13-2006
Argh. My bad. I'm using SCons and I didn't update something in a
build file, so it wasn't compiling my code above.

The code above is fine. What was broken was a pair of macros
(%$#$#*&!!!) that put an equivalent of doit.DoSomething() outside the
flow of control, so of course it's a declaration and the compiler
correctly complains.

Thank you all and sorry to waste your time,

Damien

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Singleton methods without the singleton class Charles Oliver Nutter Ruby 4 03-22-2010 10:46 PM
Singleton object vs. enhancing singleton class Paul McMahon Ruby 3 06-09-2008 06:05 AM
Singleton Modules rather than Singleton Classes Trans Ruby 12 09-14-2007 06:45 AM
Singleton - Whether Cloneable overrides Singleton Proton Projects - Moin Java 4 03-27-2007 02:59 AM
Singleton classes and Singleton pattern Wilhelm Ruby 1 10-11-2006 01:08 PM



Advertisments