テンプレートタイプがポインタの場合にのみ、以下の関数を呼び出す必要があります。以下のコードは、タイプtのテンプレートであるリンクされたリスト(標準ではないカスタムクラス)の関数です。関数がまったく呼び出されていなくても、テンプレート型がポインタでない場合、コンパイルエラーがスローされています。関数がポインタでないテンプレート型から呼び出された場合にのみエラーをスローする方法が必要であり、ポインタ型のテンプレート型から呼び出された場合にエラーが発生しないようにする必要があります。型がポインタでない場合、テンプレート関数を呼び出さないようにするにはどうすればよいですか?
virtual void ClearAndDelete()
{
ListNode<t> * ptr = this->FirstNode;
for (; ptr != nullptr;)
{
ListNode<t> * nextptr = ptr->Next;
delete ptr->Item;//ERROR C2541
delete ptr;
ptr = nextptr;
}
this->TotalNodes = 0;
this->FirstNode = nullptr;
this->LastNode = nullptr;
}
のVisual Studio 2015から特定のエラーコードは エラーC2541「削除」です。ポインタでないオブジェクトを削除することはできません。このテンプレート型のコードでこの関数を呼び出すことはありませんが、これは 'unsigned short'というテンプレート型で発生しています。提案をいただければ幸いです。
としては、あなただけを知りたい場合は、これはListNode
template<typename t> struct ListNode
{
public:
t Item;
ListNode<t> * Next;
ListNode(t what) : Item(what)
{
this->Next = nullptr;
}
ListNode(t what, ListNode<t> * nextnode) : Item(what)
{
this->Next = nextnode;
}
};
あなたはListNodeの定義を表示できます – MikeMB
@MikeMB元の投稿を編集してそれを含めました –
これを行う必要がある場合は、クラスがあまりにも多すぎるように思えます。 "懸念の分離"を見てください。 – juanchopanza