Précédent   Forum des professionnels en informatique > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/02/2012, 22h50   #1
Membre du Club
 
Avatar de Nadd
 
Étudiant
Inscription : septembre 2005
Messages : 140
Détails du profil
Informations personnelles :
Âge : 22

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 140
Points : 57
Points : 57
Par défaut [icpc/MKL] namespace has no member

Bonsoir,

Je développe à mes heures perdues une application basée sur l'utilisation de la bibliothèque MKL (Math Kernel Library). Mon projet se compose des fichiers suivants :

Citation:
../CXX_MATH
- main.cpp
- cxx_math_matrix.cpp
- cxx_math_utils.cpp

../CXX_MATH/includes
- cxx_math_matrix.h
- cxx_math_utils.h
J'ai défini un espace de nom cxx_math dans lequel j'ai défini une classe t_matrix (déclarée dans le fichier cxx_math_matrix.h et implémentée dans le .cpp) ainsi que quelques fonctions lambda.

Pour mon fichier cxx_math_utils.h :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#ifndef CXX_MATH_UTILS_H_INCLUDED
#define CXX_MATH_UTILS_H_INCLUDED
 
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
 
#include "cxx_math_matrix.h"
 
namespace cxx_math
{
    // id:
    //  returns the identity matrix
    t_matrix id(MKL_INT order);
}
 
#endif
et pour mon fichier cxx_math_matrix.h :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
#ifndef CXX_MATH_MATRIX_H_INCLUDED
#define CXX_MATH_MATRIX_H_INCLUDED
 
#include <stdlib.h>
#include <stdio.h>
 
#include "mkl.h"
#include "mkl_cblas.h"
#include "mkl_lapacke.h"
 
#include "cxx_math_utils.h"
 
namespace cxx_math
{
    /*
     * class t_matrix:
     *  represents a m*n matrix
     */
    class t_matrix
    {
    public:
    ...
    }
}
 
#endif
Ma classe est donc bien déclarée dans l'espace de nom cxx_math.

Lorsque je compile mon projet (via icpc) au moyen de la commande :

Citation:
icpc main.cpp cxx_math_matrix.cpp cxx_math_utils.cpp -Iincludes/ -lm -lmkl_rt -mkl=parallel -O3
j'obtiens l'erreur

Citation:
includes/cxx_math_utils.h(29): error: identifier "t_matrix" is undefined
t_matrix id(MKL_INT order);
Pourtant, la classe t_matrix est bel et bien définie...

Lorsque j'insère le prototype de la classe dans le fichier cxx_math_utils, en ajoutant simplement class t_matrix;, ça fonctionne mais ça reste du bricolage.

Que faire ?

En vous remerciant d'avance,

Nicolas.
Nadd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h27   #2
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
A ce qu'il me semble, une déclaration de classe doit se terminer par un ;
L'accolade fermante des namespaces doit également être suivie de d'un ;
Peut-être ceci explique-t-il que ta déclaration de classe ne soit pas correctement reconnue.

Code :
1
2
3
4
5
6
7
namespace cxx_math
{
    // id:
    //  returns the identity matrix
    t_matrix id(MKL_INT order);
};
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace cxx_math
{
    /*
     * class t_matrix:
     *  represents a m*n matrix
     */
    class t_matrix
    {
    public:
    ...
    };
};
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 12h30   #3
Membre expérimenté
 
Homme Léo Gaspard
Lycéen
Inscription : janvier 2012
Messages : 342
Détails du profil
Informations personnelles :
Nom : Homme Léo Gaspard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : janvier 2012
Messages : 342
Points : 575
Points : 575
De mémoire, l'accolade fermante des namespaces ne nécessite pas d'être suivie d'un ';'.

Le réel souci ici est autre : cxx_math_matrix inclut cxx_math_util qui inclut cxx_math_matrix.
Avec les include guards, l'un des deux ne pourra donc pas connaître l'autre à l'avance.

La solution est donc de passer à une forward declaration.
Ekleog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 14h52   #4
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
Oops... pas affûté mon regard.
@Nadd: par ailleurs, les forward declarations ne sont pas une bidouille en C++, c'est ce qu'il faut utiliser le plus possible: tant que tu n'as pas besoin (appel de fonctions ou constructeur, utilisation de membres dans une classe friend...) de la déclaration complète, il vaut mieux utiliser une simple forward declaration, ça limite la dépendance entre fichiers, avec des effets positifs en terme de temps de compilation (moins de recompilation en cas de modification de la classe).
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 21h40   #5
Membre du Club
 
Avatar de Nadd
 
Étudiant
Inscription : septembre 2005
Messages : 140
Détails du profil
Informations personnelles :
Âge : 22

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 140
Points : 57
Points : 57
Merci beaucoup ! :

Nadd.
Nadd est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h07.


 
 
 
 
Partenaires

Hébergement Web