0

ソース ファイル mycpp.c の依存ファイルをコンパイルし、使用した順序でファイルをリンクしました。依存ファイルはすべて同じフォルダーにあります。

   **//Compilation**
     $ g++  -c -w -Wno-deprecated String.c Vector.c DPStream.c CJ_Base.c mycpp.c
     **//Linking**
     $ g++ -g -o myexe String.o Vector.o DPStream.o CJ_Base.o mycpp.o
Vector.h
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#include "String.h"
#include "Storage.h"


template <class Object>
class Vector : public Storage{

        public:
                // ctors & dtor
                Vector ();
                Vector (int);
                ~Vector();

                // overloaded operators
                Object& operator[] (int nSubscript);
                void operator<<(Object &);
                void operator<<(char *);

                // access methods
                int  Count(){return _iCurrElem;};
                int  Print(ofstream &);
                void Flush();
                Resize(int);

                int  IsType() {return VectorType;};

        private:
                long _iCurrElem;
                Object *moj;
                long _iUpperBound;

                void _reserve(int);
};
#endif


Vector.c
---------
#include"Vector.h"

template <class Object>
Vector<Object>::Vector ()
{
   moj = new Object[3];
}

template <class Object>
Vector<Object>::Vector (int e)
{
moj = new Object[e];
}

template <class Object>
Vector<Object>::~Vector ()
{
  delete[] moj;
} 

template <class Object>
Vector<Object>::operator<<(Object &)
{
//stmt
}

template <class Object>
Vector<Object>::operator<<(char* ch)
{
//stmt
}

template <class Object>
Vector<Object>::Print(ofstream &foutput)
{
//stmt
}

mycpp.h に以下の順序でヘッダー ファイルをインクルードしました。

#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include "String.h"
#include "Vector.h"
#include "DPStream.h"
#include "CJ_Base.h"

しかし、それでも g++ コンパイラはエラーをスローします リンクの下に貼り付けエラー

        DPStream.o: In function `DPStream::operator<<(Vector<String>&)':
    DPStream.c:(.text+0x396): undefined reference to `Vector<String>::Print(std::basic_ofstream<char, std::char_traits<char> >&)'
    mycpp.o: In function `mycpp::ProcessFile()':
    mycpp.o:(.text+0x24e): undefined reference to `Vector<String>::operator<<(String&)'
    mycpp.o:(.text+0x2e5): undefined reference to `Vector<String>::operator<<(char*)'
    mycpp.o:(.text+0x310): undefined reference to `Vector<String>::Flush()'
    mycpp.o:(.text+0x32b): undefined reference to `Vector<String>::operator<<(String&)'
    mycpp.o:(.text+0x346): undefined reference to `Vector<String>::operator<<(String&
    mycpp.o: In function `mycpp::~mycpp()':
    mycpp.o:(.text+0x24e): undefined reference to `Vector<String>::operator<<(String&)'

問題を解決するのを手伝ってくれませんか

4

2 に答える 2

1

がどこでどのように定義されているかは示していませんVectorが、単なる推測ですVector.c。このファイルにテンプレートの実装が含まれている場合は、間違っています。テンプレートがインスタンス化されたときに、テンプレートの実装が可視である必要があります。ヘッダーに入れるか、ヘッダーからソースを含めることができますが、ソースはコンパイルしません。

また、ほとんどのコンパイラは、a.cを C++ ではなく C ソースと見なします。.cppほとんどの場合、ソースの名前をまたはに変更したいと思うでしょう.cc。その間、純粋な C++ ヘッダーの名前も変更します。どこにでもありますが、C ヘッダーと純粋な C++ ヘッダーに同じ命名規則を使用すると、混乱を招く可能性があります。

最後に、<name.h>C 標準ヘッダーの形式は標準ではありません。それらが存在する場合 (通常は存在しません)、ライブラリの古い標準化前のバージョンを参照する必要があります。(エラーメッセージから判断すると、これは明らかにそうではありません。)

于 2013-02-07T11:24:48.057 に答える
0

すべてのエラーはテンプレート関数に関連しています。

テンプレートを定義するときは、定義をファイルではなくヘッダーに入れる.cpp必要があることに注意してください。他のモジュールでは、テンプレートの独自のインスタンス化を実行するために定義が必要です。

したがって、簡単な修正は#include "Vector.c"、の最後で簡単なことを行うことですVector.h

または、テンプレートの実装全体を.hファイル内に配置します。


(また、C++ ソース ファイルには使用し.cppないでください。C++ ヘッダーにも使用すると便利です).chpp

于 2013-02-07T11:23:34.597 に答える