IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[icpc/MKL] namespace has no member


Sujet :

C++

  1. #1
    Membre régulier Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Points : 95
    Points
    95
    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 :

    ../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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

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

    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.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    namespace cxx_math
    {
        // id:
        //  returns the identity matrix
        t_matrix id(MKL_INT order);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
        ...
        };
    };

  3. #3
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    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.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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).

  5. #5
    Membre régulier Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Points : 95
    Points
    95
    Par défaut
    Merci beaucoup ! :

    Nadd.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 04/03/2015, 12h00
  2. [Compilation] Erreur : "has no member named"
    Par Trademark dans le forum Débuter
    Réponses: 8
    Dernier message: 03/05/2010, 22h11
  3. Réponses: 4
    Dernier message: 09/05/2003, 16h20
  4. Erreur récurrente (namespace)
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 3
    Dernier message: 25/02/2003, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo