/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
VC++ problem med "friends", eller?
Fra : Claus Brinch Jensen


Dato : 28-03-01 20:12

Alle,

Jeg er i MS Visual C++ 6.0 i færd med at lave en samling relaterede klasser,
der skal pakkes ind i et namespace.

I den forbindelse stødte jeg ind i et pudsigt problem, som nedenstående kode
demonstrerer.

Som det ses har jeg defineret klassen Number i namespace'et "Test"

Jeg har erklæret en friend funktion i klassen, der kan addere en short med
en Number instans.

Problemet opstår ved definitionen af friend funktionen. Compileren nægter at
kompilere denne funktion og giver fejlmeddelelsen "error C2248: '_number' :
cannot access private member declared in class 'Test::Number'"

Hvis jeg angiver namespace navnet sammen med funktionen, kan funktionen godt
kompilere, dvs. som

Number & Test:erator+(short short_number, Number & number)

Så kompilerer funktionen fint. Men bemærk at det ikke er nødvendigt at
prefixe "Number" med "Test::".

Jeg havde forventet, at når man angav "using namespace Test;" så ville det
ikke være nødvendigt at prefixe med "Test::", og compileren ville kunne
finde frem til den rigtige funktion v.hj.a. de sædvanlige regler for
overloading.
Eller gælder dette kun egentlige referencer til identifiers (ting der
allerede er defineret) i pågældende namespace og ikke nye definitioner?

For jeg kan selvfølgelig også bare pakke funktionsdefinitionen ind i en
"namespace {}" konstruktion, hvilket også vil kompilere uden problemer.

Er der nogen af jer, der kan fortælle mig hvad standarden siger på dette
område?

Mvh.
Claus

---sovs---

namespace Test
{
class Number {
public:
explicit Number(int number) { _number = number; }

operator int() { return _number; }

friend Number & operator+(short short_number, Number & number);

private:
int _number;
};
} // namespace Test


using namespace Test;

// Nedenstående funktion kan ikke kompileres med mindre den prefixes med
navnet
// på namespace, dvs. "Test:erator+(...)"
Number & operator+(short short_number, Number & number)
{
number._number += short_number;
return number;
}

#include <iostream>
using std::cout;
using std::endl;


int main(int argc, char ** argv)
{
short short_nmb = 2;
Number nmb(2);
nmb = short_nmb + nmb;
cout << "2+2=" << nmb << endl;
return 0;
}
---sovs---




 
 
Mogens Hansen (28-03-2001)
Kommentar
Fra : Mogens Hansen


Dato : 28-03-01 20:42

Hej Claus,
"Claus Brinch Jensen" <cbj@email.dk> wrote in message
news:99td59$g3s$1@news.cybercity.dk...
> Alle,
>
>
> Hvis jeg angiver namespace navnet sammen med funktionen, kan funktionen
godt
> kompilere, dvs. som
>
> Number & Test:erator+(short short_number, Number & number)
>
> Så kompilerer funktionen fint. Men bemærk at det ikke er nødvendigt at
> prefixe "Number" med "Test::".

Det er fordi du har en "using namespace Test" før funktionen.

>
> Jeg havde forventet, at når man angav "using namespace Test;" så ville det
> ikke være nødvendigt at prefixe med "Test::", og compileren ville kunne
> finde frem til den rigtige funktion v.hj.a. de sædvanlige regler for
> overloading.
> Eller gælder dette kun egentlige referencer til identifiers (ting der
> allerede er defineret) i pågældende namespace og ikke nye definitioner?

ja.

Dit program indeholder en erklæring af funktionen
Test::Number& Test:erator+(short, Test::Number&);
og definitionen af funktionen
Test::Number& :erator+(short, Test::Number&);

>
> For jeg kan selvfølgelig også bare pakke funktionsdefinitionen ind i en
> "namespace {}" konstruktion, hvilket også vil kompilere uden problemer.

Det er nok det mest almindelige at gøre.


Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste