Avatar billede narrr Nybegynder
06. januar 2004 - 00:19 Der er 9 kommentarer og
1 løsning

class i auto_ptr

Hey.

Jeg har noget kode der ligner dette:

#include <memory>
#include "Object.h"
namespace n {
    extern std::auto_ptr<Object> O;
};

Her brokker min compiler sig over, at den ikke kender Object. Hvis jeg så skriver <class Object> i stedet, så er der ingen problemer. Hvorfor dog? Object ser sådan her ud:
---
class Object {
public:
    virtual void Draw(RECT* r, UINT msg = 0){}
    virtual ~Object(){}
};
---
Avatar billede jpk Nybegynder
06. januar 2004 - 08:19 #1
Har du ligeledes defineret Object i et namespace?
Hvilken compiler bruger du?
Hvad er den præcise besked?
Avatar billede segmose Nybegynder
06. januar 2004 - 10:04 #2
Hvorfor vil du egentlig have en extern auto_ptr, auto_ptr laver et object der automatisk destructes når man går ud af scope, så vidt jeg kan se når den er extern vil den alligevel være global og derfor destructes når programmet ender, der må være noget jeg overser.
Avatar billede narrr Nybegynder
06. januar 2004 - 15:06 #3
Okay, jeg undskylder de manglende informationer.

Jpk:
- Nej, Object er ikke i et namespace.
- Visual C++ .NET
-  error C2065: 'Object' : undeclared identifier
  error C2955: 'std::auto_ptr' : use of class template requires template argument list
  error C2955: 'std::auto_ptr' : use of class template requires template argument list

Segmose:
Grunden til at jeg bruger extern, er at det foregår i en headerfil som bliver inkluderet af flere andre filer, dvs. jeg får linkerfejl hvis jeg sletter extern.
Avatar billede jpk Nybegynder
07. januar 2004 - 08:18 #4
Har du tilføjet både Object.h og Object.cpp til dit projekt?
Avatar billede segmose Nybegynder
07. januar 2004 - 08:58 #5
Prøv at lave om til

namespace n {
    extern Object O;
};

Hvilket jeg mener er det samme som din autoptr. Jeg går ud fra at din Object ligger i object.h.
Avatar billede narrr Nybegynder
07. januar 2004 - 09:10 #6
Okay, jeg har fundet ud af, at den .h-fil, som jeg lavede externen i, inkluderede object.h, som så igen inkluderede externens h. Hvis man lige byttede lidt om på .h-filerne, så kunne man udelade "class". Jeg ved godt at det lyder lidt rodet, men det er det også! :)

I må godt få pointsne, hvis I vil.
Avatar billede jpk Nybegynder
07. januar 2004 - 09:14 #7
Ellers tak...
Avatar billede segmose Nybegynder
07. januar 2004 - 10:17 #8
svar
Avatar billede segmose Nybegynder
07. januar 2004 - 10:19 #9
For at undgå sådanne problemer skal du nok lave en guard på dine .h filer således:
ex. object.h

#ifndef DIT_OBJECT_H
#define DIT_OBJECT_H

class Object {
... osv.
}

#endif

Dette forhindre at samme .h includeres flere gange.
Avatar billede narrr Nybegynder
07. januar 2004 - 19:23 #10
Jeg har faktisk allerede sådan en guard.. Jeg kan ikke helt gennemskue hvad problemet er, men det er nok fordi min kode er lidt uoverskuelig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester