2012-05-10 4 views
0

Je reçois une référence indéfinie lorsque j'essaie d'utiliser des variables de mon espace de noms. J'ai créé un fichier d'en-tête et un fichier de mise en œuvre avec l'espace de noms en elle et essaie d'utiliser l'espace de noms dans un autre fichier ...Non défini Référence aux espaces de noms en C++

ÉDITÉ:

//first.h 
namespace first 
{ 
    extern int var; 
    extern int multiplyVar(int); 
} 

//first.cpp 
namespace first 
{ 
    int var = 5; 
    int multiplyVar(int mult) 
    { 
    return mult * var; 
    } 
} 

//someOtherFile.h 
#include "first.h" 

//someOtherFile.cpp 
first::var = 3; 
int newVar = first::multiplyVar(3); 

//error 
undefined reference to 'first::multiplyVar(...)' 
undefined reference to 'first::var' 

EDIT Code actuel

//jFork.h 
#ifndef JFORK_H 
#define JFORK_H 

#include <iostream> 
#include <string> 

using namespace std; 

namespace jFork 
{ 
    extern int sockfd, newsockfd; 
    int j_fork(string); 
} 

#endif //JWDSFORK_H 

//jFork.cpp 
namespace jFork 
{ 
    int sockfd = 0, newsockfd = 0; 

    int j_fork(string name) 
    { 
    cout<<"Preparing to fork: "<<name<<endl; 

    int rv = fork(); 

    cout<<"Called fork(): "<<name<<endl; 

    switch(rv) 
    { 
    case -1: 
     cout<<"Exiting..."<<endl; 
     exit(EXIT_FAILURE); 
     break; 
    case 0: 
     if(sockfd) 
     { 
      cout<<"Closing sockfd: "<<name<<endl; 
      close(sockfd); 
      sockfd = 0; 
     } 

     if(newsockfd) 
     { 
      cout<<"Closing newsockfd: "<<name<<endl; 
      close(newsockfd); 
      newsockfd = 0; 
     } 

     break; 
    default: 
     cout<<"Preparing to sleep: "<<name<<endl; 
     sleep(1); 
     cout<<"Woke up from sleep"<<name<<endl; 
     break; 
    } 

    return rv; 
    } 
} 

//server.cpp 
int pid = jFork::j_fork(name); 
+0

avez-vous défini ces choses dans l'espace de noms en questionion dans le fichier .cpp? – PlasmaHH

+2

Je suis assez sûr que "first.cpp" ne compilera pas. Avez-vous copié-collé votre code ou est-ce un pseudo-pseudo-sorta? –

+0

@ Robᵩ son genre de psuedocode un peu ... – user1185853

Répondre

2

Remarquez le numéro extern pour les déclarations de fonction et définissez les symboles dans l'espace de noms dans le fichier d'implémentation.

//first.h 
namespace first 
{ 
    extern int var; 
    extern int multiplyVar(int); 
} 

//first.cpp 
var = 5; 
extern int multiplyVar(int mult) 
{ 
    return mult * var; 
} 

devrait être

//first.h 
namespace first 
{ 
    extern int var; 
    int multiplyVar(int); 
} 

//first.cpp 
namespace first 
{ 
    int var = 5; 
    int multiplyVar(int mult) 
    { 
    return mult * var; 
    } 
} 
+0

toujours obtenir la référence indéfinie ... Je suis supposé faire #include "first.h" ou en utilisant d'abord l'espace de noms (l'erreur indique qu'aucun espace de noms n'est nommé en premier)? – user1185853

+0

@ user1185853 Oui, vous devez inclure 'first.h' où vous voulez l'utiliser. –

+0

J'ai toujours obtenu des références indéfinies partout où j'utilise les variables et les fonctions – user1185853

-1

Essayez:

extern int first::multiplyVar(int mult) 

Votre définition est dans l'espace de noms global.

Vous pouvez également inclure toutes les définitions dans le fichier CPP dans un bloc namespace, mais ma préférence est de ne pas le faire de cette façon.

+0

La déclaration est déjà dans un espace de nom, pourquoi en ajouter un autre? Mis à part le 'extern' étant plutôt inutile pour une déclaration de fonction ... –

Questions connexes