Toon posts:

[C++] Template en pointer return

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb dus een probleempje met templates en een pointer returnen, wie kan mij helpen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
namespace storage
{
   template <class item_t>
   class Item
   {
    public:
       Item * next() const;
       
    private:       
       Item * _next;       
   };
}


code:
1
2
3
4
5
template <class item_t>
Item<item_t> * storage :: Item<item_t> :: next() const //op deze regel de foutmelding
{
   return _next;
}

De foutmelding is(een C++ error): Templates must be classes or functions.

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 03-09 23:48
Item<item_t> * wordt niet als geldig type gezien, omdat het type niet in de huidige namespace zit. Waarschijnlijk werkt het wel als je er "storage::Item<item_t>*" van maakt, of als je "using namespace storage;" gebruikt

Verwijderd

Topicstarter
Zonder namespace werkt het inderdaad wel, daarvoor bedankt. Maar het zou toch ook moeten kunnen met een namespace??? En "using namespace storage;" of "using storage::List;" is geen optie, want met een template klasse moet je de cpp in je header includen. Dat zou dus betekenen dat je je namespace vrij geeft.

Wie heeft daar misschien een antwoord op?

Verwijderd

.h
code:
1
2
3
4
5
6
7
8
9
10
11
namespace storage
{
  template <class item_t> class Item
  {
    public:
    Item * next() const;
 
    private:       
    Item * _next;      
  };
}

.cpp
code:
1
2
3
4
template <class item_t> storage::Item<item_t> * storage::Item<item_t>::next() const
{
  return _next;
}

of

.cpp
code:
1
2
3
4
5
6
7
namespace storage
{
  template <class item_t> Item<item_t> * Item<item_t>::next() const
  {
    return _next;
  }
}

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 13 maart 2002 22:49 schreef Sneechy het volgende:
.h
.cpp
.cpp
Ja maar meestal wordt de hele template class in de header vermeld.
Maar dit zou toch ook gewoon moeten werken?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace storage
{
   template <class item_t>
   class Item
   {
    public:
       Item * next() const;
       
    private:       
       Item * _next;       
   };


template <class item_t>
Item<item_t> * storage :: Item<item_t> :: next() const //op deze regel de foutmelding
{
   return _next;
}

}

Dus ook de definities meenemen in de namespace.

Verwijderd

Topicstarter
bedankt Sneechy, het werkt allemaal...

Verwijderd

Op woensdag 13 maart 2002 23:02 schreef Orphix het volgende:
Ja maar meestal wordt de hele template class in de header vermeld.

[..]

Dus ook de definities meenemen in de namespace.
Oh ja das waar ook, mijn code levert dus waarschijnlijk unresolved external errors op zodra je em gaat gebruiken.

Markvleth gebruik dus niet mijn code maar bijvoorbeeld die van Orphix. (Ik laat die van mij even staan voor het common-errors archief ;)).

Het file/translation-unit model van C/C++ heb ik altijd al shitty gevonden..

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op donderdag 14 maart 2002 01:00 schreef Sneechy het volgende:
Het file/translation-unit model van C/C++ heb ik altijd al shitty gevonden..
Nog altijd beter dan die van PHP waarbij includes gebeuren relatief t.o.v. het aangeroepen script ipv het huidige bestand (die aan het includen is) |:(

Verwijderd

Op donderdag 14 maart 2002 01:09 schreef Orphix het volgende:

[..]

Nog altijd beter dan die van PHP waarbij includes gebeuren relatief t.o.v. het aangeroepen script ipv het huidige bestand (die aan het includen is) |:(
Daar heeft Ruby ook al last van ;(.

Gelukkig hebben we daar
code:
1
2
3
$:.push File.dirname(DATA.path)
..
__END__

voor :).

Verwijderd

Topicstarter
Op donderdag 14 maart 2002 01:00 schreef Sneechy het volgende:

[..]

Oh ja das waar ook, mijn code levert dus waarschijnlijk unresolved external errors op zodra je em gaat gebruiken.

Markvleth gebruik dus niet mijn code maar bijvoorbeeld die van Orphix. (Ik laat die van mij even staan voor het common-errors archief ;)).

Het file/translation-unit model van C/C++ heb ik altijd al shitty gevonden..
Uiteraard staat onderaan mijn header file #include "unit.cpp", Dus ik doe eigelijk precies hetzelfde als Orphix, behalve dan dat de implementatie gescheiden is van de header...

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:38
Op woensdag 13 maart 2002 23:02 schreef Orphix het volgende:

[..]

Ja maar meestal wordt de hele template class in de header vermeld.
En dat werkt dus ook als je compiler geen "export" ondersteunt.
Maar dit zou toch ook gewoon moeten werken?
[code]namespace storage
{
..alles..
}
Dus ook de definities meenemen in de namespace.
Sterker nog; het is de meest nette manier. Alles
wat bij een class in namespace N hoort moet in namespace N{ } staan, dus ook losse operator+ en zo.
(Scott Meyers, Interface Principle )

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