[C++] template specialisatie in template zelf gebruiken

Pagina: 1
Acties:

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Is het in C++ mogelijk om een template specialisatie in de generieke definitie van dat template te gebruiken. Zoals b.v. in:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class T>
class Foo
{
private:
  T m_a;
  Foo<int> m_b;
public:
  Foo(const Foo<int> &);

  operator Foo<int> ();
};

template<>
class Foo<int>
{
  int m_a;
  int m_b;
};


Onder gcc 3.3.3 compileerde dit zonder problemen, maar nu onder 3.4.1 begint het te zeuren dat m_b in de generieke definitie een incompleet type heeft. Ik kan me zo'n foutmelding voorstellen, maar ik zou niet weten hoe ik het anders op moet schrijven, specialisaties moeten nu eenmaal na de generieke definitie (en forward references werken ook niet). Ook Comeau klaagt, dus ik geloof wel dat het zo fout is, maar is het gewoon een kwestie van anders opschrijven, of kan het niet wat ik wil?

[ Voor 5% gewijzigd door RickN op 13-07-2004 14:21 ]

He who knows only his own side of the case knows little of that.


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 133% gewijzigd door Eelis op 18-02-2015 19:21 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T>
class Foo;

template<>
class Foo<int>
{
  int m_a;
  int m_b;
};

template<class T>
class Foo
{
private:
  T m_a;
  ::Foo<int> m_b;
public:
  Foo(const ::Foo<int> &);

  operator ::Foo<int> ();
};

[ Voor 38% gewijzigd door MSalters op 14-07-2004 00:26 . Reden: Eelis quoten was overkill ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:21 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ja, want binnen template< typename T > class Foo is de unqualified name Foo een referentie naar de instantiatie (=type) Foo<T>, niet naar het template. Foo<int> betekent dus hetzelfde als Foo<T><int> en dat is onzin. Dit verschijnsel heet name injection. Qualified lookup omzeilt dit; door :: te gebruiken wordt er in die (global) scope gekeken en niet in de class. Op global scope is Foo de naam van een template.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 181% gewijzigd door Eelis op 18-02-2015 19:21 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Eelis schreef op 15 juli 2004 @ 13:18:
Ah ok, daar was ik inderdaad niet mee bekend. Dus GCC en Comeau hebben een extension die (in dit geval) voor 'Foo' automatisch '::Foo' kiest in plaats van 'Foo<T>' ? En hebben zij deze omdat dit misschien een toekomstige aanpassing in C++ gaat zijn?
Blijkbaar een extension, als ik me niet vergis. Dit kwam recent in [url=news://comp.std.c++]csc++[/] voorbij waar ik de extensie "template Foo" voorstelde om de non-injected name te gebruiken. ::Foo is namelijk problematisch, want dat werkt niet als Foo in een namespace zit (duh). Dit werd niet heel ergpositief ontvangen, het werd vergeleken met de struct hack, maar misschien moet ik er toch eens een paper aan wijden. In elk geval zijn er geen plannen om de GCC/Comeau hack te formaliseren.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1