0

次のように呼び出している動的配列ベースのクラスがありMyListます。

#ifndef MYLIST_H
#define MYLIST_H
#include <string>
#include <vector>

using namespace std;

template<class type>
class MyList
{
public:
  MyList(); 
  ~MyList(); 
  int size() const;
  type at() const;
  void remove();
  void push_back(type);

private:
  type* List;
  int _size;
  int _capacity;
  const static int CAPACITY = 80;
};

#endif

また、プライベート データ メンバーとしてUserインスタンスを含めたい別のクラスを呼び出しています。MyListユーザーは次のようになります。

#ifndef USER_H
#define USER_H
#include "mylist.h"
#include <string>
#include <vector>

using namespace std;

class User
{
public:
  User();
  ~User();

private:
  int id;
  string name;
  int year;
  int zip;
  MyList <int> friends;
};

#endif

コンパイルしようとすると、user.cppファイルにエラーが表示されます。

への未定義の参照MyList::Mylist()

User コンストラクタとデストラクタのみを含むMyListとはまったく関係がないため、これは奇妙に感じます。user.cpp

4

2 に答える 2

1

テンプレート クラスの宣言と定義の両方を必ずヘッダーに記述してください ( .cpp ファイルではなく、ヘッダーにMyListを定義してください)。

于 2013-02-10T14:46:33.373 に答える
0

MyClass<int>その理由は、コンストラクター定義を提供しなかったためです。残念ながら、C++ では、ヘッダー ファイルでメソッドを宣言し、それらを実装で定義することによって、テンプレート クラスの定義を分割することはできません。少なくとも、他のモジュールで使用したい場合。MyClass<int>::MyClass()したがって、あなたの場合、 User クラスには今すぐ定義が必要です。それには 2 つの方法があります。

  1. (最も簡単なもの)コンストラクター定義を適切な場所に提供します: MyClass() { ... }または

  2. そのようなクラス定義の後に MyClass.h にメソッド定義を追加します。 template<class type> MyList<type>::MyList() { ... }

于 2013-02-10T15:18:29.560 に答える