web-dev-qa-db-ja.com

クラステンプレートの引数リストがありません

私は好奇心が強い問題を抱えています、そして、私は問題が何であるかについてよくわかりません。次のコードに示すように、typenameテンプレートを使用するLinkedArrayListというクラスを作成しています。

#pragma once

template <typename ItemType>

class LinkedArrayList 
{

private:

class Node {
    ItemType* items;
    Node* next;
    Node* prev;
    int capacity;
    int size;
};

Node* head;
Node* tail;
int size;

public:

void insert (int index, const ItemType& item);
ItemType remove (int index);
int find (const ItemType& item);
};

さて、これはエラーや問題を与えません。ただし、.cppファイルに関数を作成すると、「クラステンプレート 'LinkedArrayList'の引数リストがありません」というエラーが表示されます。また、ItemTypeが未定義であることも示しています。 .cppの非常に単純なコードを次に示します。

#include "LinkedArrayList.h"

void LinkedArrayList::insert (int index, const ItemType& item)
{}

ItemType LinkedArrayList::remove (int index)
{return ItemType();}

int find (const ItemType& item)
{return -1;}

テンプレートと関係があるように見えます。コメントアウトして関数のItemTypesをintに変更しても、エラーは発生しません。また、別個の.cppを使用する代わりに、.h内のすべてのコードを実行するだけでも、正常に機能します。

問題の原因に関するヘルプは大歓迎です。

ありがとう。

17
user2146215

まず、これがクラステンプレートのメンバー関数の定義を提供する方法です。

#include "LinkedArrayList.h"

template<typename ItemType>
void LinkedArrayList<ItemType>::insert (int index, const ItemType& item)
{}

template<typename ItemType>
ItemType LinkedArrayList<ItemType>::remove (int index)
{return ItemType();}

template<typename ItemType>
int LinkedArrayList<ItemType>::find (const ItemType& item)
{return -1;}

第二に、これらの定義は.cppファイル。コンパイラは、呼び出しポイントから暗黙的にそれらをインスタンス化できないためです。たとえば、 このQ&AStackOverflow を参照してください。

18
Andy Prowl