2011-12-26 21 views
1

私はちょうどC++から始めて、この問題に遭遇しました。C++の未定義のコンストラクタ

:私はこの(Fifotest.cpp)のように私のクラスをテストし、

/* Fifo.cpp*/ 
#include "Fifo.h" 

template <class T> 
Fifo<T>::Fifo(int len) 
{ 
    //_fifoptr = new FifoImpl_class((T)len); 
    printf ("From the constructor\n"); 
    //thisbuffer = malloc(sizeof(T)*len); 
} 


template <class T> 
Fifo<T>::~Fifo() { } 

template <class T> 
int Fifo<T>::AddTokens(T* buffer, int len) 
{ 
    printf("Added tokens\n"); 
    return(1); 
} 


template <class T> 
int Fifo<T>::RetrieveTokens(T* buffer, int len) 
{ 
    printf("Removed tokens\n"); 
    return(2); 
} 

そして:

/* Fifo.h */ 
#ifndef FIFO_H_ 
#define FIFO_H_ 

#include <atomic> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

template <class T> 
class Fifo 
{ 
public: 

    Fifo<T>(int len); 
    ~Fifo<T>(); 

    int AddTokens(T* buffer, int len); 
    int RetrieveTokens(T* buffer, int len); 

private: 
    //int len; 

}; 

#endif /* FIFO_H_ */ 

そしてFifo.cppの定義:私は、FIFOがFifo.hで定義されたクラスを持っていますFifo<int>::~Fifo()' undefined reference to FIFO :: FIFO(int型)」

へ 未定義の参照:
#include "Fifo.h" 
int main(int argc, char *argv[]) 
{ 
    Fifo<int> MyFifo(20); 
} 

のgcc-4.5でそれを構築することが私にこのエラーが発生します

関連するメソッドが定義されているように見えますが、なぜこのエラーが出るのか理解できません。私はそれに時間を掛けて過ごしました。オプションは実行中のクラスを取り、それを変更することでした。しかし、私はすでに何が悪いのかを知りたい。助けていただければ幸いです!あなたはFifotest.cppからFifo.hが含まれている場合

+2

これには6兆ダースが必要です。 – Puppy

答えて

2

If you put template definition in cpp file, the definitions will not be available outside that cpp file. 、コンパイラは、テンプレートクラスの宣言を見ているが、それはメソッドの実装を見ていません。それらをFifo.hヘッダーに移動すると、すべてがコンパイルされます。

+0

まあ、できます。好きな場所に好きなものを置くことができます。 C++では、ファイルの拡張子が何であるかはわかりません。従来のインクルード・イディオムを使用すると、ほとんどのシナリオでエラーが発生します。 –

+0

私はあなたの意見を忘れてしまったと思います。それがうまくいくシナリオはたくさんあります。 "a cpp file"の定義を書いたことは重要な問題ではありません。その定義が他のTUには見えないことである。因果関係はありませんが、同等です。 –

2

2点:

  • コンストラクタが誤って宣言されます。

    Fifo<T>(int len); //wrong 
    Fifo(int len); //right 
    
  • テンプレートはそう(例えば、this questionを参照)、別の.hと.cppのファイルは通常、テンプレートでは動作しません持つ、それらが使用されているのと同じ翻訳単位で定義する必要があります。 cppファイルの内容をヘッダファイルに移動してください。

+0

実際、私は彼らがどちらも正しいと確信しています - 'Fifo 'と 'Fifo'。しかし、私は間違っているかもしれません。 – Puppy

+1

私も。そのコンテキストの 'Fifo'は' Fifo 'の同義語であり、宣言されているテンプレートの識別子はありません。しかし、私はそれも試していませんでした。 –

+0

@Tomalak:Fifoは確かにFifo と同義ですが、それは基本クラスのパブリックメンバーのように注入されたクラス名です。だから私はあなたがそれのようなコンストラクタを宣言することができないと信じる傾向がある(私は間違っているかもしれない) –

0

ヘッダーファイルに定義を入力する必要があります。 exportキーワードは標準に存在しますが、通常のコンパイラはそれを実装していません。

+0

実際は削除されました。 –

関連する問題