2016-10-13 9 views
0

グーグルにはまともな方法がないようですので、私の問題はここにあります:.hファイルが.cppファイルに含まれているのはなぜですか?その逆はありません。

.cppファイルには.hファイルが含まれています。だから、range_search.hで定義されたクラスがあり、range_search.cppに実装されているとしましょう。別のcppファイルから使用したいのであれば、私は再びrange_search.hをインクルードします。これはとにかく正しい礼儀であるようです。しかし、この方法では、私はどこにでも.cppファイルを含めていませんし、現在私のコードはその中に関数を見つけられないと不平を言っています。私は間違って何をしていますか?

最高、ありがとうございます! アレックス

EDIT:

range_search.h:

#ifndef RANGE_SEARCH_H_ 
#define RANGE_SEARCH_H_ 

namespace range_search { 

template<class Point> 
class RangeSearch { 
public: 
    using value_type = Point; 

    virtual void assign(const std::vector<Point>& points) = 0; 
}; 

} // namespace range_search 
#endif // RANGE_SEARCH_H_ 

range_search.cpp:

#include "range_search.h" 

namespace range_search { 

    /// Sets the underlying set. 
    void assign(const std::vector<Point>& points){ 
     //doing stuff 
    } 
} 

main.cppに:

#include "range_search.h" 

using Point = std::array<double, 2>; 

int main(){ 

    //initialize some points 
    range_search::RangeSearch<Point> r(); 
    r.assign(points); 

} 

エラー願いを1として残念ながらドイツ語である:

Fehler:AbfrageデElementes»«Rの«DASのVOM NICHT-Klassentyp»range_search :: RangeSearch>()«IST r.assign(点)で»を割り当てます。私はそれを伝えることができるものから、

はmain.cppには

+0

説明がわかりません。あなたの問題を再現する可能性のある最小限のコードとコードをコンパイルする方法 –

+1

0が丸くてフェミニンであり、1がまっすぐで男性的であるという事実に照らして、現代の情報技術分野の男性優位性は、すべてのコンピュータで0と1を切り替えるだけで、1を下位の非支配的な位置に置くことができます。 .hと.cppファイルの役割を切り替える必要はありません。おもう。 –

+0

このエラーの原因は 'range_search :: RangeSearch r();'はパラメータを取らず、 'range_search :: RangeSearch 'を返す関数を宣言していることです。エラーが示すように、 'r'にはクラス型はありません。 'range_search :: RangeSearchを使用する r;' – molbdnilo

答えて

0

これはとにかく右のエチケットであるように思わrange_search.cppへのリンクを持っていないという事実によるのです。 エチケットの問題ではありませんが、.cppファイルは翻訳単位とみなされ、適切なコンパイラまたはビルドシステムによって処理されます。

.hファイルには、他の翻訳単位で使用するために必要なすべての宣言が含まれています。

コンパイルされた.cppのファイルは、最終リンクフェーズで一緒にステッチされます。

この方法では、私はどこにでも.cppファイルを含めていません。現在、私のコードは、そこに関数を見つけられないことについて不平を言っています。私は間違って何をしていますか?

おそらく、生成されたオブジェクトファイルのリンクの最後の部分を取得することができませんでした。あなたの編集については


あなたは、より特殊なケースである、今でテンプレート宣言を見せています。コンパイラは、正しくインスタンス化されるようにテンプレート定義を参照する必要があります。

あなたがここで詳細についての詳細を読むことができます:Why can templates only be implemented in the header file?

+0

ありがとう!私はそれがテンプレートによるものではないと私自身は考えていませんでした。 – user4457190

+0

@ user4457190喜んでお答えください:) –

0

これは(そのことについて及びC)C++そのように降りてくるの構築。コンパイラは.cppファイルをオブジェクトファイル(通常は.oまたは.obj)にコンパイルします。リンカは、複数のオブジェクトファイルを1つのバイナリ(実行可能ファイルまたはライブラリ)にリンクします。

あなたのコンパイラ(実際にはリンカー)は、それらのオブジェクトファイルがリンクに含まれていないため、呼び出す関数の定義が見つからないと訴えています。または、あなたの質問から、実際のエラーなしで言うのは難しいようです(将来、実際のエラーメッセージを含めてください)。

さまざまなもの(クラス、関数、何を持っているか)の宣言(通常は定義ではない)がコンパイラに見えるように、.hファイルが含まれています。これらを含めなかった場合、コンパイラはそれらのヘッダーで宣言されたものは宣言されていないと不平を言うので、それらが何であるかを知ることはできません。

私はこれに関するいくつかのドキュメントを実行しようとします。現時点では、コンパイラ/ IDEのドキュメントを確認してください。複数のオブジェクトファイルをリンクするための情報が必要です。

+3

Nitpick:ヘッダーには通常、クラス定義があり、メンバー関数の定義は '.cpp'ファイルにあります。 'struct foo {int a; void bar(); }; 'はクラス定義です。 – juanchopanza

+0

@juanchopanzaそれはまだ_class宣言と呼ばれていませんか? –

+0

@πάνταῥεῖそれは宣言でも定義でもあります。しかし、通常は定義が必要です。定義ではない宣言は 'struct foo;'です。 – juanchopanza

関連する問題