我是一名有用的助手,可以为您翻译文本。
我是C++的新手。这是我的作业,下面是教授给我们的代码,以帮助我们完成这个任务,但它无法编译... 我标记了产生错误的行,并显示了错误消息“Cannot refer to template 'hash' without a template argument list”。
我不确定如何修复它。请问有人能指点我正确的方向吗?
(我已经删除了我认为与错误消息无关的行。)
该类的定义如下:
--- 在 C++ 文件中的 int hash() 函数 ----
我是C++的新手。这是我的作业,下面是教授给我们的代码,以帮助我们完成这个任务,但它无法编译... 我标记了产生错误的行,并显示了错误消息“Cannot refer to template 'hash' without a template argument list”。
我不确定如何修复它。请问有人能指点我正确的方向吗?
(我已经删除了我认为与错误消息无关的行。)
该类的定义如下:
template <typename HashedObj>
class HashTable
{
public:
//....
private:
struct HashEntry
{
HashedObj element;
EntryType info;
HashEntry( const HashedObj & e = HashedObj( ), EntryType i = EMPTY )
: element( e ), info( i ) { }
};
vector<HashEntry> array;
int currentSize;
//... some private member functions....
int myhash( const HashedObj & x ) const
{
int hashVal = hash( x ); <<--- line with error
hashVal %= array.size( );
if( hashVal < 0 )
hashVal += array.size( );
return hashVal;
}
};
int hash( const HashedObj & key );
int hash( int key );
--- 在 C++ 文件中的 int hash() 函数 ----
int hash( const string & key )
{
int hashVal = 0;
for( int i = 0; i < key.length( ); i++ )
hashVal = 37 * hashVal + key[ i ];
return hashVal;
}
int hash( int key )
{
return key;
}
using namespace std;
的原因)。而且你没有定义int hash(const string& key);
。对于整数来说,Identity是一个可怕的哈希函数。此外,你的哈希函数似乎根本不依赖于表容量,这对我来说有些奇怪。 - Cubicusing namespace std;
(或任何其他命名空间),而不是在头文件中使用,就没有问题。期望人们总是用std::限定每个库名称是荒谬的。你会对C#中像System.Windows.Controls这样的命名空间说同样的话吗?甚至期望人们不在头文件中这样做也是荒谬的,但这确实会引入问题(这是C++过时模块系统的问题)。 - user1610015std
限定每个库名称,也不使用using namespace std;
,所以你提出了一个错误的二分法。即使你的二分法是真实存在的,即使C++语言对程序员的要求是荒谬的,你仍然必须满足这些要求,否则你的C++代码将是错误的。我更喜欢正确的荒谬代码而不是错误的明智代码。 - Steve Jessopusing namespace std;
,我想你是指使用特定项的using
(例如using std::string
)。这比限定它们更荒谬(如果您只使用该项一次会怎么样?)。 - user1610015std::
来限定它,而不是为了没有特定好处而编写额外的代码,就像你想象的那样。如果你决定发明一些你认为我可能会做的荒谬事情,那么当然你会得出你发明的编码风格是荒谬的结论。 - Steve Jessop