• ベストアンサー

includeが出来ない訳とは?

みなさん、こんにちわ。 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; ========================== すごく簡単な内容でしたら大変恐縮ではありますが、 周囲にプログラム経験者が皆無な事もあり、 小さな事でも アドバイスいただけると大変ありがたい次第です。 どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.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が、 設定されている必要があります。

vfr_rooom
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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

vfr_rooom
質問者

お礼

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

vfr_rooom
質問者

補足

Tacosanさん! アドバイスありがとうございます。 紛らわしくてすいみませんです。 丁度、class3の部分が、 「class test{};」となっている感じになっていて、 次のように考えてしまいました次第です。 dirA::test::test hoge;  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ========================== [host]#cat test.hpp namespace dirA { namespace test { class1{};  ・ class2{};  ・ class3{}; } // namespace test } // namespace dirA ==========================

すると、全ての回答が全文表示されます。
  • min_is
  • ベストアンサー率25% (1/4)
回答No.2

もしかして、java のパッケージとC++名前空間を勘違いしてるということは ありませんか? C++では dirA というディレクトリに配置しても、test というクラス宣言が dirA名前空間にあるわけではありません。 dirA名前空間に testクラスを宣言したければ、前述の方が提示された ように namespace dirA { class test {}; } とする必要があります。

vfr_rooom
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

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; で大丈夫です。

vfr_rooom
質問者

補足

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;  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

すると、全ての回答が全文表示されます。

関連するQ&A