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

Template type parameters as friends in gcc

P: n/a
Hey all,

So I have a template class whose only template parameter is a type that the
class is to manage. It's actually an implementation of the common Singleton
design pattern. The class looks like this:

template< class Type >
class Singleton
{
public:
static Type& instance();
private:
static Type* _instance;
};

The instance() method looks like this:
Type& Singleton::instance()
{
if( _instance == NULL )
{
_instance = new Type();
}
return *_instance;
}

So, if I wanted to make a singleton class, it would just have to inherit from
this template class like so:

class Tableau : public Singleton< Tableau >
{
private:
// Make the constructor private so other parts of the
// code can't create a new instance
Tableau();

// Make the Singleton class a friend so that it can
// create the static instance of this guy.
friend Singleton< Tableau >;
};

This all works fine with MS Visual C++ .Net. This also used to work with gcc.
However, I tried to compile this with gcc 3.4.4 for cygwin, and no go. I get
the following error.

tableau.h:35: error: a class-key must be used when declaring a friend

A quick google for that error message and I see that newer versions of gcc do
not allow these so-called "ill-formed type" to be friends. However, I can't
find a fix or a work-around for this.

So, can anyone suggest a way to make make my singleton template more
platform-independent?

Thanks.

Dave
Feb 22 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
Dave Rudolf wrote:
Hey all,

So I have a template class whose only template parameter is a type that
the class is to manage. It's actually an implementation of the common
Singleton design pattern. The class looks like this:

template< class Type >
class Singleton
{
public:
static Type& instance();
private:
static Type* _instance;
};

The instance() method looks like this:
Type& Singleton::instance()
{
if( _instance == NULL )
{
_instance = new Type();
}
return *_instance;
}

So, if I wanted to make a singleton class, it would just have to inherit
from this template class like so:

class Tableau : public Singleton< Tableau >
{
private:
// Make the constructor private so other parts of the
// code can't create a new instance
Tableau();

// Make the Singleton class a friend so that it can
// create the static instance of this guy.
friend Singleton< Tableau >;
};

This all works fine with MS Visual C++ .Net. This also used to work with
gcc. However, I tried to compile this with gcc 3.4.4 for cygwin, and no
go. I get the following error.

tableau.h:35: error: a class-key must be used when declaring a friend

A quick google for that error message and I see that newer versions of
gcc do not allow these so-called "ill-formed type" to be friends.
However, I can't find a fix or a work-around for this.

So, can anyone suggest a way to make make my singleton template more
platform-independent?

Thanks.

Dave
template and friends are not my strength, and it seems so obvious that
I'm probably wrong, but have you tried

friend class Singleton< Tableau >;

?

john
Feb 22 '07 #2

P: n/a
On Feb 22, 5:36 pm, John Harrison <john_androni...@hotmail.comwrote:
Dave Rudolf wrote:
Hey all,
So I have a template class whose only template parameter is a type that
the class is to manage. It's actually an implementation of the common
Singleton design pattern. The class looks like this:
template< class Type >
class Singleton
{
public:
static Type& instance();
private:
static Type* _instance;
};
The instance() method looks like this:
Type& Singleton::instance()
{
if( _instance == NULL )
{
_instance = new Type();
}
return *_instance;
}
So, if I wanted to make a singleton class, it would just have to inherit
from this template class like so:
class Tableau : public Singleton< Tableau >
{
private:
// Make the constructor private so other parts of the
// code can't create a new instance
Tableau();
// Make the Singleton class a friend so that it can
// create the static instance of this guy.
friend Singleton< Tableau >;
};
This all works fine with MS Visual C++ .Net. This also used to work with
gcc. However, I tried to compile this with gcc 3.4.4 for cygwin, and no
go. I get the following error.
tableau.h:35: error: a class-key must be used when declaring a friend
A quick google for that error message and I see that newer versions of
gcc do not allow these so-called "ill-formed type" to be friends.
However, I can't find a fix or a work-around for this.
So, can anyone suggest a way to make make my singleton template more
platform-independent?
Thanks.
Dave

template and friends are not my strength, and it seems so obvious that
I'm probably wrong, but have you tried

friend class Singleton< Tableau >;

?

john- Hide quoted text -

- Show quoted text -
Yes, so obviously wrong that you are right :). That actually did it.
Thanks.

Mar 9 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.