2017-10-29 24 views
0

私は名前空間とそのメンバーをグローバルに利用できるようにしようとしていますが、私はalready definedエラーに遭遇しています。C++グローバル名前空間のメンバーは既にエラーを定義しています

Settings.h

#pragma once 
#include "boost/property_tree/json_parser.hpp" 
#include <string> 

using json = boost::property_tree::ptree; 
namespace Settings { 

    extern std::string settingsPath; 
    extern json settings; 

    extern void init(); 
    extern void readSettings(); 
    extern void writeSettings(); 
}; 

Settings.cpp

#pragma once 

#include "Settings.h" 

using json = boost::property_tree::ptree; 

namespace Settings { 

    void init() { 

    } 

    void readSettings() { 

    } 

    void writeSettings() { 

    } 
}; 

私は前方Settings名前空間とメンバーを宣言し、externを使用しています。私は何が間違っているのか分かりません。誰かがここでエラーを指摘できますか?

おかげ

編集:実際のエラーメッセージ:

Error LNK2005 "class std::basic_string<char,struct std::char_traits<char>,class 
     std::allocator<char> > Settings::settingsPath" ([email protected]@@3V?$ 
     [email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@A) already defined in 
     AmalgamService.obj Amalgam F:\Dropbox\CPP\Visual Studio Projects\Amalgam\Amalgam\ 
     main.obj 1 

と名前空間のすべてのメンバーのために繰り返します。 Settings.hはあなたが別のファイルでSettings.cppを含めているように見える#includemain.cppでエドとAmalgamService.cpp

+1

実際のエラーメッセージをコピーして質問に貼り付けてください。そして、関数を宣言する 'extern'は必要ありません。 – molbdnilo

+1

とは無関係です。 cppファイルを '#pragma once 'する必要はありません。あなたがcppファイルをインクルードしているなら、より大きな問題が発生しています。 – user4581301

+0

エラーメッセージを追加しました。また、 '#pragma once'情報に感謝します。私はcppファイルを含んでいないので、ここではほんの小さな問題です – user2513924

答えて

0

です。 .cpp個のファイルを含めないでください。これにより、重複した定義が作成されます。これはまたの.cppファイルが役に立たないことを意味します。

#includeは貼り付けツール&のコピーであることを覚えておく必要があります。 #includeファイルの場合、そのファイルは文字通り&というコピーが#includeステートメントの場所に貼り付けられています。したがって、.cppファイルを含めると、ファイル.cppに定義されているすべての定義が複数取得されます。

さらに、関数を宣言するときにexternを使用する必要はありません。あなたが特に断りない限り、関数はデフォルトでexternです。

変数があまりにもデフォルトでexternある、しかし、あなたはそれらを定義することなく、それらを宣言するための方法としてexternを使用する必要があります:あなたは自分の体を省略することによって、それらを宣言することができるので、

extern int var; // declaration 
int var; // definition 

機能は、その必要はありません:

void func(); // declaration 
void func() { } // definition 

あなたはある、物事を複数回宣言するために許可されている理由をすることができます複数のファイルで#includeヘッダファイル(のような.h.hpp)。しかし、何も定義することは許されません。そのため、非ヘッダソースファイル#includeはできません。

関連する問題