[C++] Object wordt functie definitie?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Ik heb de volgende class definitie
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
public:
    class B
    {
    public:
        B(){}
    };

    A( const B & );
    A();
    const A &operator=( const A & );
};
En deze code:
C++:
1
2
3
4
A a1( A::B() );
A a2;
a2 = a1;
a1 = a2;
In Visual Studio 6 compileert dit zonder problemen, en de juiste constructors worden ook aangeroepen.
In Vision Studio 2010 krijg ik de volgende fouten:
code:
1
2
3
4
5
6
a2=a1;
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'A (__cdecl *)(A::B (__cdecl *)(void))' (or there is no acceptable conversion)
          could be 'const A &A::operator =(const A &)'
          while trying to match the argument list '(A, A (__cdecl *)(A::B (__cdecl *)(void)))'
a1=a2;
error C2659: '=' : function as left operand
Wat gebeurt hier?

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Simpel: je definieert a1 als een functie met 1 argument A::B (*ptrFun)( ) en return type A.

Je bedoelde waarschijnlijk A a1 = A::B();

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat MSalters zegt. Helaas kunnen in sommige gevallen functiedeclaraties en objectdefinities ambigu zijn - in zo'n geval heeft de betekenis als declaratie voorrang. Iets als
C++:
1
int i();

is dus geen default constructed int genaamd i, maar een functie genaamd i die een int returnt.
Trekken we dat door:
C++:
1
int i(int());

Dit is eveneens geen int i die gecopyconstruct wordt van een default constructed int, maar een functie genaamd i die een int returnt en een pointer verwacht naar een functie die een int returnt.

Deze laatste is vergelijkbaar met jouw A a1( A::B() );
MSalters schreef op vrijdag 22 juni 2012 @ 13:22:
Je bedoelde waarschijnlijk A a1 = A::B();
Het is dan wel weer jammer dat de copy ctor daarvoor accessible moet zijn (wat het in dit geval ook is)

[ Voor 17% gewijzigd door .oisyn op 22-06-2012 14:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Hoe moeilijk kun je het maken? Inderdaad compileert 'A a1 = A::B();' wel gewoon.

En logischerwijs A a1( A::B( 1 ) ); ook. (Na aanpassen van de A::B() constructor.)

Bedankt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoiets kan ook:
C++:
1
2
3
template<class T> const T & identity(const T & t) { return t; }

A a(identity(A::B()));

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.