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