• ベストアンサー

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

  • シェルスクリプトで、コピーする際に、特定の名前のディレクトリを除外

    シェルスクリプトで、 あるディレクトリ(原則として、配下のディレクトリ・ファイルもすべて)を別の場所へコピー(上書きコピー)したいのですが、それに関して質問します。 仮に、dirAという名前のディレクトリを、それに対応するdirBというディレクトリへ上書きコピーするということにします。 dirAとdirBは、似たディレクトリ構成を持つと、イメージしてください。(対応するディレクトリがあるとは限らないが。) dirAディレクトリを単純にコピーするならば、cpコマンドの -R オプションを使えばいいと思います。 しかし、dirAディレクトリ配下のうち、ある特定の名前(固定)を持つディレクトリ(そこにあるファイルも。)はコピーしたくないのです。そのためには、どうすればよいのでしょうか。 仮に、そのコピーしないディレクトリの名前をTaroとすると、私は、次のようにすることを考えましたが、これは意図どおり動きません。 find dirA ! \( -name "Taro" \) -a -type d -exec cp -R {} dirB \; 尚、次のことがわかっています。 ・このディレクトリTaroは、dirAやdirBの配下のいろいろなディレクトリに散在する。 ・このディレクトリTaroの配下には、ディレクトリは存在しない。(dirA・dirBのいずれでも。)

  • Sambaの拒否と認証の基準が知りたい

    はじめまして。katsu-kitiと申します。 いろいろoption付けてGoogle検索したのですが、狙ったものが出ず、こちらにお助け願いたく質問します。宜しくお願い致します。 Windows環境で、Sambaのファイル共有サーバにアクセスすると 「\\hogehogeにアクセス出来ません。このネットワークリソースを使用するアクセス許可がない可能性があります。アクセス許可があるかどうかこのサーバーの管理者に問い合わせて下さい」 というダイアログが出て拒否される場合と 認証ダイアログが出てユーザ名とパスワードを求められる場合があります。 パーミションを付けたディレクトリをいくつかSamba共有し、それぞれのディレクトリに、アクセスしてくる人に対して上記のような即拒否でなく、認証画面を出して駄目なら拒否という運用がしたいのです。 登録しているユーザは 1) Administrator ->dirAにrwxで、dirBにrwx 2) Userhoge ->dirAにrwxで、dirBに--- 3) userboge ->dirAにr--で、dirBにrw- 4) everyone ->dirAにr--で、dirBにr-- といった感じです。 宜しくお願い致します。

  • インクルードすると おかしい

    インクルードすると"1"が表示されてしまい、困ってます。 コードがまずいのか?対処方法があるのか? すみませんが、教えてください。 状況は以下のとおりです。 test.php <?php echo include('./header.html'); ?> header.html <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> test.phpを実行すると、なぜか"1"が表示されてしまいます。 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • cygwinでのboost

    cygwin上でboostを用いたいんですが、うまくいきません。 test.cppで、#include<boost/ramdom.hpp>としており、 コマンドを、 $ g++ -I"C:\cygwin\usr\include\boost-1_33_1" test.cpp とすると boost/ramdom.hpp: No such file or directory となってしまいます。 ramdomがboost-1_33_1の中にあるのは確認してます。 いろいろ調べてみたんですが上手くいきません。 よろしくお願いします。

  • VC++6.0でのインクルード

    VC++初心者です。 環境はVC++ on win2kなのですが、 ヘッダファイルを別のファイルにしてコンパイルしたいのですが、できません。 test.cppの中身 #include <iostream> #include <string> #include <stdio> ・・・* #include "kneko.h" using namespace std; int main() { kneko x("tama"); x.naku(); } kneko.hの中身 #ifndef __kneko_h #define __kneko_h class kneko { string name; public: kneko(){}; kneko(string n){ name=n; } void setname(string n){ name=n; } void naku() const { cout <<"My name is"<<"name"<<"."endl; } }; #endif この2つを同じディレクトリに入れて、 ビルド→コンパイルすると、*のところで 「インクルードファイルがオープンできません。」 というエラーが出ます。 ためしに*の行を削除すると、エラーが8つぐらい出てきます。 どうやらヘッダファイルを読み込めていないようです。 インクルードの書式が間違っているのでしょうか?

  • Xerces 2.0.0 のg++(4.4.7対応

    The Apache Xerces 2.0.0のソースを本家サイトの以下から入手し、コンパイルを実施していますが、コンパイルエラーとなってしまいます。 コンパイラは、g++(gcc version 4.4.7)なのですが、対応していないのでしょうか。 <https://archive.apache.org/dist/xml/xerces-c/> 素人ながら少し調べる限り、iostream.hのインクルードに失敗しているようです。 エラーのでているソースのiostream.hのインクルードの書き方は古い書き方(C準拠)で、g++4.4.7のコンパイラに対応していないようです。 対応した書き方は、<iostream>と.hを書かないようです。 実際、環境にあるのは、/usr/include/c++/4.4.4/iostreamでした。 バージョンが4.4.4の理由は不明ですが… Xercesをコンパイルしようとしていますが、C++未経験です。 質問にあたり、提示が必要な情報が不足している場合は教えて頂けますと幸いです。 ■OS Redhat ES 6.6(カーネル:2.6.32-504.3.3.el6.x86_64) ■CPU Intel(R) Xeon(R) CPU E5-2637 v4 @ 3.50GHz ■C++コンパイラ g++ -vコマンドで表示すると以下のバージョンが表示されます。 gcc version 4.4.7 20120313 (Red hat 4.4.7-11) (GCC) ■コンパイルコマンド 説明の便宜上、コンパイルに関係のないpwd等のパスが分かる操作も含めています。 [root@xxxxx test]# pwd /usr/local/test [root@xxxxx test]# ls xerces-c-src2_0_0.tar.gz [root@xxxxx test]# tar xvzf xerces-c-src2_0_0.tar.gz [root@xxxxx test]# cd ./xerces-c-src2_0_0/src/xercesc [root@xxxxx test]# cd ./xerces-c-src2_0_0/src/xercesc [root@xxxxx test]# pwd /usr/local/test/xerces-c-src2_0_0/src/xercesc [root@xxxxx xercesc]# export XERCESCROOT=/usr/local/test/xerces-c-src2_0_0 [root@xxxxx xercesc]# autoconf [root@xxxxx xercesc]# ./runConfigure -plinux -cgcc -xg++ -minmem -nsocket -tnative -rpth ■コンパイルエラー コンパイルエラー部分と直前の関係がありそうなメッセージ部分を抜粋します。 make -C framework make[1]: ディレクトリ `/usr/local/test/xerces-c-src2_0_0/src/xercesc/framework' に入ります mkdir -p /usr/local/test/xerces-c-src2_0_0/include/xercesc/framework cp -fp LocalFileInputSource.hpp LocalFileFormatTarget.hpp MemBufInputSource.hpp MemBufFormatTarget.hpp StdInInputSource.hpp StdOutFormatTarget.hpp URLInputSource.hpp Wrapper4DOMInputSource.hpp Wrapper4InputSource.hpp XMLAttDef.hpp XMLAttDefList.hpp XMLAttr.hpp XMLBuffer.hpp XMLBufferMgr.hpp XMLContentModel.hpp XMLDocumentHandler.hpp XMLElementDecl.hpp XMLEntityDecl.hpp XMLEntityHandler.hpp XMLErrorCodes.hpp XMLErrorReporter.hpp XMLFormatter.hpp XMLNotationDecl.hpp XMLPScanToken.hpp XMLRecognizer.hpp XMLRefInfo.hpp XMLValidator.hpp XMLValidityCodes.hpp /usr/local/test/xerces-c-src2_0_0/include/xercesc/framework (省略) g++ rget.o StdOutFormatTarget.cpp StdOutFormatTarget.cpp:66:22: error: iostream.h: そのようなファイルやディレクトリはありません StdOutFormatTarget.cpp: In member function ‘virtual void StdOutFormatTarget::writeChars(const XMLByte*, unsigned int, XMLFormatter*)’: StdOutFormatTarget.cpp:83: error: ‘cout’ was not declared in this scope make[1]: *** [StdOutFormatTarget.o] エラー 1 make[1]: ディレクトリ `/usr/local/test/xerces-c-src2_0_0/src/xercesc/framework' から出ます make: *** [Framework] エラー 2

  • wordpressでincludeが表示されない

    wordpressで投稿した際に、phpのincludeファイルを読み込ませようとしています。 wordpressのサイトを sample.com とした場合、 投稿記事に以下を貼り付けています。 <?php include("http://sample.com/include/link.inc");?> サイトはUTF-8、link.incファイルもUTF-8で保存しています。 試しにsample.comの直下にtestフォルダを作って、その中にhtmlファイルを作って 同様に上記のphpのinclude記述をしたところ、ちゃんと表示されました。 ちなみに別のドメインサイト(HTMLサイト)でも上記の記述で表示されました。 wordpressのサイトで表示されないのは何が原因でしょうか?

    • 締切済み
    • PHP
  • mkdirで生成したディレクトリに写真を保存する方法を教えて下さい。

    行いたいことは、phpでディレクトリを生成して、その中に写真ファイルを保存したいのですが、おそらくディレクトリの所有者と権限(パーミッション)の問題でうまくいきません。 今試している手順は以下の通りです。 //ディレクトリの生成場所 $uploadDir = "./img/DirA"; //ディレクトリを生成 パーミッションは777にしたい mkdir ($uploadDir,0777); //フォームからアップロードした写真を「DirA」に移動 move_uploaded_file($_FILES['photoA']['tmp_name'],$uploadDir."/photoA.jpg"; 上記で、無事、ディレクトリ「DirA」が生成されるのですが、その後の写真を「DirA」に保存する段階でうまくいきません。 原因について色々調べてみたのですが、生成した「DirA」の所有者が「apache」になっていて、権限が「777」で指定しているにも関わらず、「755」しか与えられないからだと思いました。 おそらく、「DirA」の権限が「777」(書込権限を付与)できれば、問題ないと思うのですが、これは、Apache自体に書込権限がないことが理由なのでしょうか? もし、この件については、何か方法があれば、教えて頂きたいです。 Apacheに書込み権限を与える設定をサーバーに行うことが必要なのでしょうか?それ以外に方法がありますでしょうか? 最終的には、生成されたディレクトリに写真を保存できれば良いのです。 どうぞ、宜しくお願い致します。 環境 Apache 1.3.37 PHP 5.2.5 MySQL 5.1.22-rc

    • ベストアンサー
    • PHP
  • Cygwin boost

    Windows XP sp2 + Cygwin の C++ で正規表現を使いたく setup.exe で boost をインストールし、以下のコードをコンパイル($g++ regextest.cpp) したのですがエラーが出てしまいました。 コード: #include <boost/regex.hpp> #include <iostream> using namespace std; int main () { string str("Free Programming For Windows."); boost::regex reg("Free.+Windows\\."); if (boost::regex_match(str, reg)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; } return 0; } エラー: regextest.cpp:1:27: boost/regex.hpp: No such file or directory パスが通っていないようなのですが、どうしたらよいか分かりません。アドバイスいただけたら嬉しいです。 usr/include/boost-1_33_1 に boost/regex.hpp は確認できました。

  • PHP includeについて

    今、下記のようなサーバサイドのプログラムを作成しており、 解決できずに困っております。 【環境】 CentOS5 [PHP5] sakuraインターネット レンタルサーバ スタンダートプランです。 参考:http://www.sakura.ne.jp/rentalserver/matrix.html 【概要】 cronよりinclude関数を含むPHPファイルを実行、 そのPHPファイル内から他dirに保管されているテキストを参照し、 外部ASPへ文字列を送信する、という内容です。 理想としては、 cron1よりphp1を実行し、 php1に記載されている下記、 include 'phpA'; include 'phpB'; これら2行を完結させる事です。 しかしphpAは正常動作するのですが、 phpBは正常に動作せず、理想と異なる結果になります。 テストとして、下記を実行しました。 ★test1 php1のinclude関数を入れ替える。 include 'phpB'; include 'phpA'; 結果:phpBは正常動作、phpAにエラー。 ★test2 cron1よりphpAのみを実行 cron2を追加しphpBを実行 結果:phpA&B共に正常動作。 ★test3 test1と同じ構造でphp1を次のように変更。 include 'phpA'; sleep(30); session_unset(); $_SESSION = array(); session_destroy(); session_start(); include 'phpB'; 結果:phpAのみ正常動作。 上記の通り、cronを2種作成すれば理想の結果が返るのですが、 仕様上それは採用できず、あくまでphp1のみをcronより実行する 必要があります。 セッション・変数をリセットする必要があるのかと test3を試しましたが結果は同じでした。 尚、私はPGを専業としておらず質問に不適切な記載があるかと存じます。 お知恵をお借りできますと幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP