プロが教えるわが家の防犯対策術!

みなさん、こんにちわ。
C++の勉強を始めたばっかりの弱小物ではありますが、
INCLUDEの件に関して、
分からないことが発生し、
検索方法が悪いのか?自己解決に至りませんでしたので、
お力をかしていただけると大変ありがたく質問させていただきました。
宜しくお願い致します。


他のディレクトリ下にあるhppファイルを
includeしようと思っていたのですが、
コンパイルすると、
以下のとおりのお叱りをいただいてしまいます。


error: ‘test.hpp’ in namespace ‘dirA’ does not name a type
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

詳細は以下のとおりです。

・ディレクトリ「dirA」の直下に 「test.hpp」 があり、
・ディレクトリ「dirB」の直下に 「go.hpp」 がある。

「go.hpp」の先頭にて、
以下のとおり、
test.hppのインクルードを済ませてはいます。

==========================
[host]#cat go.hpp

#include <dirA/test.hpp>

dirA::test _mark;
==========================



すごく簡単な内容でしたら大変恐縮ではありますが、
周囲にプログラム経験者が皆無な事もあり、
小さな事でも
アドバイスいただけると大変ありがたい次第です。
どうぞ宜しくお願い致します。

A 回答 (4件)

> namespace dirA {


> namespace test {
> class1{};
> class2{};
> class3{};
> } // namespace test
> } // namespace dirA
> dirBの「go.hpp」では、次のようにすれば正解なのですかね?

例えばこんな感じになりますね。
 dirA::test::class1 mark1;
 dirA::test::class2 mark2;
 dirA::test::class3 mark3;

ちなみに、C++のnamespaceはJavaのpackageとは違うので、
ディレクトリ配置を気にする可能性があるのはincludeであって、
namespaceはファイル構成やディレクトリ配置とは無関係です。
特に必要なければディレクトリ名と同じ名前のnamespaceをつける必要はありませんし、
特に必要が無ければディレクトリを別にする必要もありません。
勿論、意図してのものならばいいのですが。

後、もう一点、念のための確認です。

通常、
> ・ディレクトリ「dirA」の直下に 「test.hpp」 があり、
> ・ディレクトリ「dirB」の直下に 「go.hpp」 がある。
> #include <dirA/test.hpp>
この書き方で、test.hppをincludeするためには、
「dirAの上のディレクトリ」に対してinclude用のパスが設定されている必要がありますが
(goo.hppが何処のディレクトリにあるかは基本的に関係ない)、これは大丈夫でしょうか。

一般に、<>で囲んだincludeのパスを有効にするには、
コンパイラへのパラメータ設定(や環境変数)などが必要です。

例えば、xxx/yyy/test.hppにファイルがあるとすると、
 #include <test.hpp>と書くならばxxx/yyyが、
 #include <yyy/test.hpp>と書くならばxxxが、
設定されている必要があります。
    • good
    • 0
この回答へのお礼

MrBanさん!

再びありがとうございます!
インクルードパスの設定を行うも、
現在は解決には至りませんでしたが、
インクルードの部分に関して、
少しjavaと混同していた部分を改める事ができました。

いただいたアドバイスを参考に、
もう少し、進めてみたいと思います。

お礼日時:2009/01/07 12:30

ん~,


dirA::test::test
と「test」が 2回出てきてるのはなぜだろう. その形で名前空間を定義するなら
dirA::test::クラス名
のようになるはず. たとえば
namespace dirA {
namespace test {
class class1 {};
...
}
}
なら
dirA::test::class1 hoge;
のように.

この回答への補足

Tacosanさん!
アドバイスありがとうございます。
紛らわしくてすいみませんです。

丁度、class3の部分が、
「class test{};」となっている感じになっていて、
次のように考えてしまいました次第です。

dirA::test::test hoge;
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

==========================

[host]#cat test.hpp

namespace dirA {
namespace test {

class1{};
 ・
class2{};
 ・
class3{};

} // namespace test
} // namespace dirA

==========================

補足日時:2009/01/06 11:25
    • good
    • 0
この回答へのお礼

Tacosanさん

数に制限があるために、
ポイントこそ付与できませんでしたが、
アドバイスいただけまして大変感謝しております。
ありがとうございました。
参考になりました!

お礼日時:2009/01/07 12:32

もしかして、java のパッケージとC++名前空間を勘違いしてるということは


ありませんか?

C++では dirA というディレクトリに配置しても、test というクラス宣言が
dirA名前空間にあるわけではありません。

dirA名前空間に testクラスを宣言したければ、前述の方が提示された
ように namespace dirA { class test {}; } とする必要があります。
    • good
    • 0
この回答へのお礼

min_isさん!

アドバイスありがとうござます!
min_isさんや皆さんからのご意見を聞き、
namespaceについて理解が深まりました。

確かに、
以前はjavaをやってました。

お礼日時:2009/01/06 11:44

include自体はできていて、dirA::testが見つからないといわれているのではないですか。



C++のnamespaceは、ヘッダがディレクトリdirAにあろうがdirBにあろうが関係なく、
ディレクトリ名:: とは書きませんが、dirAという名前のnamespaceがtest.hppにありますか?

もし、test.hppのなかで、
 namespace dirA { class test {}; }
などと書いてあるならば、
 dirA::test mask;
になります。
もし、test.hppのなかで、
 namespace Foo { class test {}; }
とあれば、
 Foo::test mask;
です。

もしも、単にヘッダファイルをdirAにおいたというだけで、
test.hppのなかは、
 class test {};
等であれば、単に
 test mask;
で大丈夫です。

この回答への補足

MrBanさん!
優しくご回答いただきましてありがとうございました!
やはり、インクルード自体はうまく出来ているのですね。

質問時に情報が不足していたので、
「test.hpp」に関して付け足しさせていただきます。
「test.hpp」内のnamespaceは以下のとおりになっていますので、


==========================

[host]#cat test.hpp

namespace dirA {
namespace test {

class1{};
 ・
class2{};
 ・
class3{};

} // namespace test
} // namespace dirA

==========================


dirBの「go.hpp」では、次のようにすれば正解なのですかね?
度々、恐縮です。

dirA::test::test mark;
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

補足日時:2009/01/06 10:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!