"Is not a member of" Fehler beim Bauen von Dedupe

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

"Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Bebu » Do Apr 21, 2011 12:53 pm

Ich baue ja immer noch am Commandozeilen Interface. Dazu habe ich verschiedene Klassen geschrieben, die ein einfaches hinzufügen von neuen Befehlen möglich machen sollen. Jetzt habe ich aber das Problem, das ich es nicht kompiliert bekomme. Die Fehlermeldung deutet ja auf einen fehlenden Header hin, aber der ist eingebunden. Ich bin mit meinem Latein am Ende, vielleicht sieht einer von euch, was ich nicht sehe:

Code: Alles auswählen

#ifndef ORG_PROGGEN_DEDUPE_CLI_ACTION_H
#define ORG_PROGGEN_DEDUPE_CLI_ACTION_H

#include <boost/function.hpp>
#include <kernel.h>
#include <command.h>
#include <cli.h>

namespace Dedupe
{
  namespace CLI
  {
    /**
      *A Action object holds a list of allowed commands and the
      *function which should be executed, if the correct commands are given.
      */

    class Action
    {
      public:

      /**
        * KFPointer is a function pointer which can be every function from
        *the kernel with the following signature: returning type bool, Argument
        *Dedupe::FilePath
        */
      typedef boost::function<bool ( Dedupe::Core::Kernel*, Dedupe::FilePath )>
              KFPointer;

      typedef boost::function<bool ( Dedupe::CLI::CLI* )> CFPointer;




      /**
        *Give a Dedupe::CLI::CommandList, the adress of the function that
        *should be executed, if the right arguments are given and the current
        *kernel object
        */
      Action( Dedupe::CLI::CommandList List,
              KFPointer Functionpointer,
              Dedupe::Core::Kernel Kernel )

              : List( List ),
                functionpointer( Functionpointer ),
                Kernel( Kernel ),
                disabled( false )
      {
        /*sort the list, cause the list from CheckAllowed will also be sorted,
          to make sure, different positions don't result in a error */

        std::sort( List.begin(), List.end() );
      }

      Action() : disabled( true ) {}

      /**
        *Check if the holded list of commands and the given is equal
        */
      bool CheckAllowed( Dedupe::CLI::CommandList ComList ) const
      {
        if( disabled == true ) return false;

        std::sort( ComList.begin(), ComList.end() );

        return ( ComList == List );
      }

      /**
        *Execute the function. The function argument musst be given here.
        *@param Dedupe::FilePath @return true if holded function returns true
        */
      inline bool ExecFunction( Dedupe::FilePath Path )
      {
        if( disabled == true ) return false;
        //See reference of boost.Function
        return functionpointer( &Kernel, Path );
      }

      private:
      Dedupe::CLI::CommandList List;

      Dedupe::CLI::Action::KFPointer functionpointer;
      Dedupe::Core::Kernel Kernel;

      bool disabled;
    };
  }
}
#endif
Das Problem ist diese Zeile:

Code: Alles auswählen

typedef boost::function<bool ( Dedupe::CLI::CLI* )> CFPointer;
CLI ist in cli.h deklariert und der ist auch eingebunden. Trotzdem bekomme ich folgenden Fehler: error: 'CLI' is not a member of 'Dedupe::CLI'
Ich sehe vermutlich vor lauter Bäumen den Wald nicht mehr, aber bitte HILFE, sonst drehe ich hier noch ab...

Hier noch die cli.h

Code: Alles auswählen

#ifndef ORG_PROGGEN_DEDUPE_CLI_CLI_H
#define ORG_PROGGEN_DEDUPE_CLI_CLI_H

#include <string>
#include <vector>
#include <iostream>
#include <searchfiles.h>
#include <commandgroup.h>

namespace Dedupe
{
  /**
    *CLI stands for Command Line Interface and contains everything
    *from that userinterface
    */
  namespace CLI
  {
    /**
      *StartArgs is a simple string vector for
      *the start arguments from main()
      */
    typedef std::vector<std::string> StartArgs;

    class CLI
    {
      public:
      CLI( Dedupe::CLI::StartArgs const &Args );

      bool RegisterGroup( Dedupe::CLI::CommandGroup Group );

      void PrintHelp();

      private:

      Dedupe::FileSearch::FileStream GivenPaths;

      short HandleArgs( Dedupe::CLI::StartArgs const &Args );

    };
  }
}

#endif
Vollständiger Code ist im Repo und kompiliert zur Zeit nicht :(
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Xin » Do Apr 21, 2011 1:59 pm

Bebu hat geschrieben:Das Problem ist diese Zeile:

Code: Alles auswählen

typedef boost::function<bool ( Dedupe::CLI::CLI* )> CFPointer;
CLI ist in cli.h deklariert und der ist auch eingebunden. Trotzdem bekomme ich folgenden Fehler: error: 'CLI' is not a member of 'Dedupe::CLI'
Ich sehe vermutlich vor lauter Bäumen den Wald nicht mehr, aber bitte HILFE, sonst drehe ich hier noch ab...
Was ist (Dedupe::CLI::CLI *) eigentlich für ein Datentyp? Lies den Datentyp mal gaaaanz langsam...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Bebu » Do Apr 21, 2011 2:18 pm

Das ist ein Pointer auf eine Klasse. Die Zeile soll einen Funktionszeiger auf eine der Memberfunktionen erzeugen, bzw. definieren. Aber das ist nicht das Problem. Wenn ich die Zeile rauswerfe und stattdessen einfach eine Instanz der Klasse erzeugen will, ist es das gleiche Problem. Alles was in diesem Header declariert ist, wird nicht gefunden, geradeso als ob der Header nicht einkopiert werden würde. Aber er steht im Code und ich habe auch die Präprozessordefinitionen überprüft. Ich verstehs einfach nicht.

Also entweder habe ich etwas übersehen, es ist ein Fehler in Cmake, den ich nicht finde, oder der Compiler hat einen Schatten, was wohl eher unwahrscheinlich ist...
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Xin » Do Apr 21, 2011 2:30 pm

Bebu hat geschrieben:Das ist ein Pointer auf eine Klasse.
<stirnklatsch>, Xin... ließ das mal gaaanz langsam.

Ich habe den Namespace CLI übersehen und sah in Dedupe::CLI::CLI den Konstruktor.
Bebu hat geschrieben:Alles was in diesem Header declariert ist, wird nicht gefunden, geradeso als ob der Header nicht einkopiert werden würde. Aber er steht im Code und ich habe auch die Präprozessordefinitionen überprüft. Ich verstehs einfach nicht.
Schuss ins Rote, ohne mir den Code anzusehen.

Ein Header A bindet den Header B ein, welcher dann wieder Header A einbindet?
Das jedenfalls ist das übliche Problem. In Header B kommen dann die Fehler, weil das #define von A verhindert, dass A erneut eingebunden wird. Also hat B keine Ahnung, worum es geht.
So ein zyklisches Include kann natürlich auch A->B->C->A gehen...

In dem Fall darfst Du nur noch Zeiger oder Referenzen verwenden und musst auf das Include verzichten und die Klassen im Header stattdessen deklarieren.

Code: Alles auswählen

namespace Dedupe { namespace CLI { class CLI; }}
Vermutlich bindet cli.h auf einem Umweg cli_action.h ein.
Bebu hat geschrieben:der Compiler hat einen Schatten, was wohl eher unwahrscheinlich ist...
Ich habe schon einige Compilerfehler gefunden, aber sehr, sehr viel mehr selbst gemachte ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Bebu » Do Apr 21, 2011 3:49 pm

Xin hat geschrieben:
Ein Header A bindet den Header B ein, welcher dann wieder Header A einbindet?
Das jedenfalls ist das übliche Problem. In Header B kommen dann die Fehler, weil das #define von A verhindert, dass A erneut eingebunden wird. Also hat B keine Ahnung, worum es geht.
So ein zyklisches Include kann natürlich auch A->B->C->A gehen...

In dem Fall darfst Du nur noch Zeiger oder Referenzen verwenden und musst auf das Include verzichten und die Klassen im Header stattdessen deklarieren.

Code: Alles auswählen

namespace Dedupe { namespace CLI { class CLI; }}
Vermutlich bindet cli.h auf einem Umweg cli_action.h ein.
Ich glaube, du hast den Nagel auf den Kopf getroffen. Es sind vier Klassen, bei der fast jede eine der anderen Klassen verwendet. Ich habe da wohl einen richtigen Knoten produziert und muss erst mal sehen, wie ich den wieder aufgelöst bekomme. Im schlimmsten Fall muss ich doch sofort auf Templates ausweichen, damit meine Klassen voneinander unabhängig werden
Xin hat geschrieben:
Bebu hat geschrieben:der Compiler hat einen Schatten, was wohl eher unwahrscheinlich ist...
Ich habe schon einige Compilerfehler gefunden, aber sehr, sehr viel mehr selbst gemachte ^^
Es wäre ja zu einfach, wenn man alles auf den Compiler schieben könnte... außer man hat ihn selbst programmiert ;)
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Xin » Do Apr 21, 2011 4:44 pm

Bebu hat geschrieben:Ich glaube, du hast den Nagel auf den Kopf getroffen. Es sind vier Klassen, bei der fast jede eine der anderen Klassen verwendet. Ich habe da wohl einen richtigen Knoten produziert und muss erst mal sehen, wie ich den wieder aufgelöst bekomme.
Ich bin professioneller Entwickler. Es ist mein Job diesen Fehler regelmäßig zu machen. ;-)

Du musst eine Klasse so formulieren, dass sie nur Referenzen oder Zeiger verwendet.
Du kannst die Klasse A dann wie zuvor gezeigt einfach deklarieren statt A über #include in den Header von B einzubinden. Damit ist der Knoten gelöst.

Alle Funktionen von B, die A verwenden und nicht nur einfach als Zeiger oder Referenz durchreichen, müssen dann im .cpp-File definiert werden. Hier kannst Du wieder ohne Probleme beide Header einbinden, da sie ja keine zyklische Referenz mehr besitzen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Bebu » Fr Apr 22, 2011 10:10 am

Also ich verzweifle noch über meinem Knoten, vielleicht kann man mir jemand ein paar konkrete Tipps geben. Danke
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Xin » Fr Apr 22, 2011 10:45 am

Bebu hat geschrieben:Also ich verzweifle noch über meinem Knoten, vielleicht kann man mir jemand ein paar konkrete Tipps geben. Danke
Ist eine aktuelle Version im Repository?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: "Is not a member of" Fehler beim Bauen von Dedupe

Beitrag von Bebu » Fr Apr 22, 2011 10:47 am

Ja, ist sie, hab ich gestern hochgeladen, seit dem bin ich nur am rumprobieren. Das Ergebnis, ist bisher immer schlechter, als vorher.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten