我已经宣布operator=
这样:
HashTable& operator=(const HashTable& aTable);
我可以通过以下方式在课堂外定义它:
template <typename HashElement>
HashTable& HashTable<HashElement>::operator=(const HashTable& aTable)
{
/*Do the copy thing*/
return *this;
}
我希望使用以下代码进行编译:
HashTable<EngWord> hashTable;
HashTable<EngWord> hashTableA;
hashTableA = hashTable;
但编译器并不喜欢定义的签名。错误消息是:
HashTable: suer of class template requires template argument list
HashTable<HashElement>::operation=': unable to match function definition or an existing declaration
我在互联网上看到的应该是我写的方式。怎么了?
答案 0 :(得分:3)
您必须在返回类型中添加模板参数列表,如错误消息所示:
HashTable<HashElement>& HashTable<HashElement>::operator=(const HashTable& aTable)
参数不需要模板参数列表,因为编译器已经知道您正在定义HashTable<HashElement>::operator=
,您可以在其中使用injected-class-name。
同样适用于在类模板定义中声明operator=
。您可以在那里省略返回类型模板参数,但不能在类外部进行定义。