Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » #ifdef implementierung separat -> templates?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.11.2009, 22:30 Uhr
~Fragexxy
Gast


Hallo,

ich möchte anhand bedingter Kompilierung 2 separate files mit funktionen führen die gleich signatur haben aber unterschiedliches anstellen.

Ich habe jetzt mal ein Minimalbeispiel entstellt:

main.cpp


C++:
#include "Impl_Env.h"
#include "Matrix.h"
#include <iostream>
#include <stdexcept>


int main(int argc, char *argv[])
{
    int                 num_procs,
                        my_id;
                      
    int a = 9;
    int b = 8;
    Matrix<int>*     A_REAL    = new Matrix<int>(ENV_WORLD,a,b);
#ifdef ENV_MPI
                        std::cout << "PARALLEL" << std::endl;
#else
                        std::cout << "SERIAL" << std::endl;
#endif

}



Impl_Env.h


C++:

#ifndef IMPL_ENV_H
#define IMPL_ENV_H


#ifdef ENV_MPI
#       include <mpi.h>
#define ENV_WORLD void*
#       include "parallel/Impl_MPI.h"
#else
#define ENV_WORLD void*
#       include "serial/Impl_SERIAL.h"
#endif

#endif


Matrix.h

C++:
#ifndef GUARD_MATRIX_H
#define GUARD_MATRIX_H

#include "Impl_Env.h"

template <class T_Field>
class Matrix
{

    public:

        /// Empty Constructor
            Matrix<T_Field>(){};
            Matrix<T_Field>(ENV_WORLD       world_m,
                            const int        nbr_cols,
                            const int        nbr_rows);
            ~Matrix<T_Field>(){};
        int num_procs, my_id;

};

#include "Matrix.imp"

#endif



Matrix.imp

C++:
#include "Impl_Env.h"

//C/C++ includings
#include <string>
#include <stdlib.h>
#include <sstream>
#include <iostream>

template <class T_Field>
Matrix<T_Field>::Matrix(ENV_WORLD       world_m,
                        const int        nbr_cols,
                        const int        nbr_rows)
{
    Env_Stats(num_procs, my_id);
    std::cout << num_procs << std::endl;
}



Impl_MPI.h

C++:
#ifndef IMPL_MPI_H
#define IMPL_MPI_H


//file includings
#include "../Matrix.h"


inline void
Env_Stats(ENV_WORLD world, int& num_procs, int& my_id)
{
     num_procs = 3;
}

#endif



Impl_SERIAL.h

C++:
#ifndef IMPL_SERIAL_H
#define IMPL_SERIAL_H

//file includings
#include "../Matrix.h"


inline void
Env_Stats(ENV_WORLD world, int& num_procs, int& my_id)
{
    num_procs = 2;
}

#endif



Die Meldung mit meinem g++ ist:

Code:
parallel/../Matrix.imp: In constructor »Matrix<T_Field>::Matrix(void*, int, int)«:
parallel/../Matrix.imp:14: Fehler: es gibt keine Argumente für »Env_Stats«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »Env_Stats« verfügbar sein muss
parallel/../Matrix.imp:14: Fehler: (mit »-fpermissive« wird G++ den Code akzeptieren, aber die Verwendung eines nicht deklarierten Namens ist veraltet)    



Ich könnte jetzt z.B. alles in einen header packen den 2 verschiedene *.cpp dateien includieren. Dann hätte ich die struktur dass Impl_*.cpp die implementierung vornimmt. Allerdings includiert man doch eher header anstatt *.cpp dateien.

andererseits werde ich templates benutzen. Geht denn dieser ansatz überhaupt mit templates ? wie sieht es da dann mit spezialisierungen aus?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.11.2009, 12:18 Uhr
0xdeadbeef
Gott
(Operator)


Dass der Code oben nicht funktioniert, liegt daran, dass deine Header sich in einer Weise gegenseitig einbinden, dass sich die Reihenfolge, in der sie am Ende stehen, davon abhängt, welcher der Header vom Compiler zuerst gesehen wird. Räum die Abhängigkeiten auf, dann müsste das auch flutschen.

Bei Templates wirst du den ganzen Code im Header zur Verfügung stellen müssen, weil der Compiler dann, wenn er ihn konkretisieren muss, den gesamten Code braucht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: