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---