1. ホーム
  2. c++

[解決済み】クラステンプレートの引数リストがない

2022-01-19 15:17:53

質問

私は不思議な問題を抱えています。 以下のコードに示すように、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ファイルで関数を作成すると、エラー "Argument list for class template 'LinkedArrayList' is missing." ItemType is undefinedというエラーも発生します。 以下は、.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をintsに変更するとエラーにならないので、テンプレートが関係しているようです。 また、すべてのコードを別の.cppの代わりに.hに記述すると、同様にうまく動作します。

問題の原因について、何かご助言をいただければ幸いです。

ありがとうございます。

解決方法は?

まず、クラステンプレートのメンバ関数の定義は、このようにします。

#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&A on StackOverflow .