2012-05-10 20 views
0

私の名前空間から変数を使用しようとすると、未定義参照が取得されています。未定義C++での名前空間への参照

//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実際のコード

:私はEDITEDは

...それで名前空間を持つヘッダファイルと実装ファイルを作成し、別のファイルに名前空間を使用しようとしています
//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

あなたは.cppのquesionで名前空間内にそれらのものを定義しましたか? – PlasmaHH

+2

"first.cpp"はコンパイルされません。あなたのコードをコピーして貼り付けましたか、これはまあまあの擬似コードですか? –

+0

@Robᵩその一種の擬似コード... – user1185853

答えて

2

機能の宣言と実装ファイルの名前空間でのシンボルの定義については、externはありません。あなたの定義はグローバル名前空間にある

extern int first::multiplyVar(int mult) 

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

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

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

まだ定義されていない参照を取得しています...私は#include "first.h"または最初に名前空間を使うことになっています(エラーは最初に名前空間がないと言います)? – user1185853

+0

@ user1185853はい、あなたはそれを使いたい場所に 'first.h'を含める必要があります。 –

+0

私は変数と関数を使用するどこでも未定義の参照を取得しました – user1185853

-1

てみであるべき。

また、namespaceブロック内のCPPファイル内のすべての定義をラップすることもできますが、この方法ではできません。

+0

宣言は名前空間に既にあります。関数宣言では無意味な「extern」以外に... –

関連する問題