2012-04-19 8 views
-2

codeblocks ver 10.05に問題があります。私はC++プロジェクトを作って、私はこのようなプログラムを書いた:リンクはコードブロックでは機能しません! (未定義の参照先...)

main.cppに

#include <iostream> 
#include "vectorddd.hpp" 


using namespace std; 

int main() 
{ 

    vector3D<int> tesztinttomb; 
    tesztinttomb.saveout("igen.dat"); 
    return 0; 
} 

ヘッダファイル(vectorddd.hpp):

#ifndef VECTORDDD_HPP_INCLUDED 
#define VECTORDDD_HPP_INCLUDED 

#include <iostream> 

template <class T> 
class vector3D { 
    T *x; 
    T *y; 
    T *z; 
    int meret; 
public: 
    void saveout(char* FileName); 

    vector3D(int Meret=0) : x(new T[meret]), y(new T[Meret]), z(new T[Meret]), meret(Meret) {} 

    ~vector3D() { delete [] x; delete [] y; delete [] z; } 
}; 


#endif // VECTORDDD_HPP_INCLUDED 

実装ファイル(vectorddd.cppを) :

#include "vectorddd.hpp" 

template <class T> 
void vector3D<T>::saveout(char* FileName) { 
    int i=0;// I know this is stupid... but the emphasis is on the linking problem 

} 

それだけではリンクしません。私は.cppファイルのリンクをチェックし、プロパティ - >ビルドオプションで設定をコンパイルする必要があることを知っています。そして、私は何の問題を見つけることができませんが、ただいつも同じことを記述している:

In function `main': 
undefined reference to `vector3D<int>::saveout(char*)' 
||=== Build finished: 1 errors, 0 warnings ===| 

そして、私は私の.HPPファイルへの.cppファイルの実装を置けば、それは正常に動作します。しかし、これはコードブロックがどのように動作するかではありません。

+5

[テンプレートの定義はヘッダに行かなければならない](のhttp:// WWW .parashift.com/C++ - faq/templates.html#faq-35.13)、これはCBとは関係ありません。 – ildjarn

+0

http://stackoverflow.com/q/115703/1214731ここをクリックして詳細を読む – tmpearce

答えて

2

あなたのテンプレートはヘッダファイルに入れておく必要があります。それについて考えると、テンプレートがcppファイルにある場合、どのようにテンプレートをインスタンス化できますか?

あなたはこの置く必要があります:あなたのヘッダーvectorddd.hppファイルに

template <class T> 
void vector3D<T>::saveout(char* FileName) { 
    int i=0;// I know this is stupid... but the emphasis is on the linking problem 

} 

が同様のSOの記事を参照してください。Storing C++ template function definitions in a .CPP file

+0

私の機能には、チームプレートのメンバーがいません。 – Marcell

+0

cppに含まれていると、なぜインスタンス化できないのですか?それは一緒にリンクされていて、コンパイラが見ると関数が呼ばれ、関数の実装から関数を呼び出すだけです。 – Marcell

+0

これはちょうどこのように動作しないと私は信じられません。 – Marcell