2016-05-21 5 views
2

Was ist falsch mit dem folgenden Code. Ich erhalte Kompilierungsfehler. Ich habe auch versucht Erklärung der Klasse B. Aber konnte nicht gelingen.C++ - Kompilierungsfehler bei der Verwendung von Typdef 'Members einer anderen Klasse

Test.cpp

#include <memory> 
#include <iostream> 

namespace api 
{ 

class A 
{ 
public: 
    typedef std::shared_ptr<A> APtr; 
    APtr get_a_ptr();  
    B::BPtr get_b_ptr(); 
}; 

class B 
{ 
public:  
    typedef std::shared_ptr<B> BPtr; 
    BPtr get_b_ptr(); 
    A::APtr get_a_ptr(); 
}; 

} 


int main(int argc, char **argv) 
{ 
    return 0; 
} 

Antwort

1

es wie folgt tun:

namespace api 
{ 
    class B; // forward declaration 

    class A 
    { 
    public: 
     typedef std::shared_ptr<A> APtr; 
     APtr get_a_ptr();  
     std::shared_ptr<B> get_b_ptr(); 
    }; 
    ... 
} 

Das Problem ist, dass Sie etwas von der Klasse fordern B, die noch nicht definiert wurde. Also benutze std::shared_ptr<B> und es wird dir gut gehen.


Weitere lesen: When can I use a forward declaration?

+0

Aber warum kann ich Typedef von Klasse B shared_ptr in Klasse A nicht verwenden? – aditya1811

+0

Ich habe gerade meine Antwort mit der Antwort auf diesen Kommentar @ aditya1811 aktualisiert. Da eine Vorwärtsdeklaration besagt, dass eine Klasse "B" folgen wird, verspreche ich Herrn Compiler, aber der Compiler weiß nicht, welche Klasse "B" in ihm enthalten sein wird. – gsamaras

1

Das Problem in Ihrem Code ist, dass B::BPtr nicht vor der Klasse deklariert wird, eine Erklärung. Sie sollten vor Gebrauch BPtr deklarieren. Zum Beispiel:

class B; 
class A; 

typedef std::shared_ptr<B> BPtr; 
typedef std::shared_ptr<A> APtr; 


class A 
{ 
public: 
    APtr get_a_ptr();  
    BPtr get_b_ptr(); 
}; 

class B 
{ 
public:  
    BPtr get_b_ptr(); 
    APtr get_a_ptr(); 
}; 

Denken Sie daran, dass Sie nicht operator* und operator-> mit shared_ptr vor der vollständigen Klassendeklaration verwenden können.

+0

Natürlich wäre das auch eine Lösung. Sollte das gedeckt haben, bravo! – gsamaras

+1

Ich mag typedefs nicht für shared_ptr, also wähle ich in der Praxis Ihre Antwort (= – gomons

Verwandte Themen