2017-02-07 4 views
-1

私は、プロジェクトの他の場所にあるTaxConstants.hpp名前空間TAXCONSTANTSで宣言されている定数int SIZEを使用しようとしています。私がコンパイルしようとすると、私はどこでもそのサイズが参照されている「 'SIZE' に未定義の参照を取得C++ネームスペース内でextern constを参照する

ファイルをTaxConstants.hpp

#ifndef TaxConstants_hpp 
#define TaxConstants_hpp 


namespace TAXCONSTANTS 
{ 
    extern const int SIZE = 4; // I have tried with and without extern 
} 

#endif //TAXCONSTANTS_HPP 

main.cppに

#include <iostream> 
#include "TaxConstants.hpp" 
using namespace std; 
using namespace TAXCONSTANTS; 

int main() 
{ 
extern const int SIZE; 

// This is a struct defined in another file. It is a sample of my use for SIZE. I left out the #include above to simplify things. 
taxPayer payers[SIZE]; 

//More code 

return 0; 
} 

追加情報:この学校プロジェクトであり、私の教師は名前空間TAXCONSTANTSのファイルTaxConstants.hppに定数を宣言する必要がありました。

私は、合計で5つのファイルがあります。 nightsはSIZEエラーと同じ未定義リファレンスを持っています。

私はextern関数と名前空間について同様の説明を検索するのに時間を費やしましたが、最初の提案ではこれを行う代わりに別の解決策を提示することに反対しています。私は、残念ながらそれらを使用することはできません。人々が持っていた他のエラーは、私が持っていない "複数の装飾"を得ていた。

編集

詳細については、以下の説明を参照してください。私が行うために必要な何

は、名前空間TAXCONSTANTSでTaxConstants.hppファイル内

const int SIZE = 4; 

を定義しました。

次に、 'extern const int SIZE;を削除します。 を私のメインファイルから取り出して、代わりにTAXCONSTANTS :: SIZEでSIZEを参照してください。

これは私が完全に忘れてしまった基本的な名前空間です。

+0

可能な重複:[なぜ "extern const int n;"が期待どおりに機能しないのですか?](http://stackoverflow.com/questions/14894698/why-does-extern-const-int-n-not-work -as-expected) –

+0

これは名前空間とは関係ありませんが、extern constの問題です。 –

+0

検索用語[stackoverflow C++ extern const](https://www.google.com/search?q=stackoverflow+c%2B%2B+extern+const&ie=utf-8&oe=utf-8)を使って他の投稿を見ることができます) –

答えて

0

SIZEexternキーワードなしで定義すると、constであるため、内部リンケージになります。 main.cppにはTAXCONSTANTS::SIZEと記載されています。これは、コンパイラがSIZEが使用されているどこかの値をインライン化できるため、お勧めします。

あなたはでexternキーワードをSIZEを定義した場合、それは外部リンケージを持つことになりますし、あなたが複数の定義のエラーをしない限り、それは、ヘッダにすべきではありません。代わりに、それをプログラムの残りの部分にリンクされる.cppファイルに定義する必要があります。この場合、プログラム全体にはSIZEのコピーが1つしかありません。何らかの理由でが実際にはプログラム全体でSIZEのコピーを1つだけ持つ必要がある場合を除いて、このアプローチ(externを使用しないアプローチを選択)を避けるべきです。

どちらの場合でもSIZETAXCONSTANTS名前空間のメンバーになります。

SIZEmainの中に再宣言しようとしたのは、あなたが思っていることをしません! main内で次のよう

extern const int SIZE; 

は、実際にはグローバル名前空間にSIZEを宣言する効果があります。グローバル名前空間にSIZEの定義がないため、リンク時に未定義の参照エラーが発生します。 ではなくSIZE変数を参照する正しい方法はTAXCONSTANTSで定義されています。

+0

ありがとう、私はここに戻って確認する前にそれを理解しました。あなたは書いてありました、私は間違っていると思っていたので、代わりにTAXCONSTANTS :: SIZEを使用してください。 – Bow

0

アプローチ全体に複数の問題があります。 main

  1. あなた

    extern const int SIZE; 
    

    グローバル名前空間からconst intオブジェクトSIZEの宣言である - ::SIZE。このSIZEは、あなたのTAXCONSTANTS::SIZEとはまったく関係ありません。このようなグローバル::SIZEオブジェクトはプログラムで定義されていないため、「未定義参照」エラーが発生します。

    すでにヘッダファイルにTAXCONSTANTS::SIZEと宣言しているので、SIZEを再度mainに再宣告する必要はありません。なぜあなたはこれをやっている?

    だけmainから宣言を削除し、using namespace TAXCONSTANTSを介して、または修飾名TAXCONSTANTS::SIZEを指定することで、どちらかTAXCONSTANTSからSIZEを使用しています。

  2. ヘッダーファイルの宣言は、実際にはの定義です。このヘッダーファイルを複数の翻訳単位に含めると、別のエラーが発生します。外部リンケージを持つ同じオブジェクトの複数の定義。あなたはグローバル定数オブジェクトを宣言したい場合は

    、あなたはヘッダファイル

    namespace TAXCONSTANTS 
    { 
        extern const int SIZE; // declaration, not definition 
    } 
    

    に単なる非定義宣言を維持し、実装ファイルのいずれかに定義を移動する必要が

    namespace TAXCONSTANTS 
    { 
        extern const int SIZE = 4; // definition 
    } 
    
  3. しかし、この定数をInteger Constant Expression(配列宣言の配列サイズ)として使用する予定です。イニシャライザなしで宣言された定数extern const intは、その目的のためには機能しません。

    はちょうど約externを忘れて、ヘッダファイルで内部リンケージを持つ通常の定数を宣言

    namespace TAXCONSTANTS 
    { 
        const int SIZE = 4; // definition with internal linkage 
    } 
    

    してからちょうどで使用どこでもそれが必要とされている

    using namespace TAXCONSTANTS; 
    
    int main() 
    { 
        taxPayer payers[SIZE]; 
        ... 
    } 
    

    または

    // no 'using namespace TAXCONSTANTS;' 
    
    int main() 
    { 
        taxPayer payers[TAXCONSTANTS::SIZE]; 
        ... 
    } 
    
+0

ありがとう、私はあなたが言及したようにTAXCONSTANTS :: SIZEのように書くはずだった。 – Bow

関連する問題