2012-01-03 16 views
3

から私はtest1.cppC++の名前空間別のソース・ファイル

namespace a { 
int main1() { 
    return 3; 
} 
} 

という名前のファイルがあると私は別のファイルtest2.cpp

#include <stdio.h> 
using a::main1; 
int main() { 
    printf("%d", a::main1()); 
} 

を持ってそれから私は、G ++で'a' has not been declaredを言って、コンパイルエラーを得ました。私がここで逃したものを見つけるのを手助けしてください、そして、通常これを行う方法。

ありがとうございます。

答えて

4

ヘッダファイルに名前空間、クラス、関数を宣言し、test2.cppファイルに含める必要があります。

+0

名前空間とクラスまたは関数を同じファイルに宣言することもできますが、それは悪い習慣です。宣言はヘッダファイルに入れなければなりません。 –

1

ヘッダーファイルに:: main1を宣言し、test1.hと呼んでから、そのヘッダーをtest2.hに含める必要があります。さもなければ、test2はあなたがtest1でデカールしたものを知る方法がありません。

test1.h

namespace a { 
int main1(); 
} 

test1.cpp

namespace a { 
int main1() { 
    return 3; 
} 
} 

test2.cpp '' ので、あなたが呼び出す

#include <stdio.h> 
#include test1.h 
using a::main1; 
int main() { 
    printf("%d", a::main1()); 
} 
0

あなたの機能main1()は、名前空間で宣言されていますprintf()では、コンパイラがどのような名前空間を参照するのかを知る必要があります。

  1. あなたが行ったようにあなたが明示的に::を使用して名前空間を呼び出すことができます:

    printf ("%d", a::main1()); 
    
  2. それともでき、それが最初だどこかの上にこれを行うには、2つの方法は、(私が知っている)しています

    using namespace a; 
    
:一般的にラインを使って、「」名前空間でシンボルを探すためにコンパイラに伝える、使用

私が使用しているコンパイラ(MS Studio 2008)は、両方のテクニックを併用すると文句を言わなかった。

あなたが行ったエラーを受けた理由は、あなたの「使用している」ステートメントが正しくコンパイラーのために形成されていなかったからです(上記参照)。

+0

確かに彼の問題は、test2にはtest1が含まれていないので、名前空間は不明ですか? – StevieG

+0

Nope。他の2つの答え(この時点で)はマークを逃しています(実際にコードを含むものはエラーなしでコンパイルされません)。問題は「使用している」ステートメントが誤って形成されていることです!ヘッダーやcppファイルに何かがあるかどうか気にするC/C++コンパイラ(私が知っている)は、言語規則に従ってそれを見て解析できるだけで十分です。しかし、私は、ヘッダーで物事を宣言することが一般的にベストプラクティスであることに同意します - 物事を整理し、保守しやすいものに保ちます。 –

関連する問題