【发布时间】:2012-10-11 05:29:34
【问题描述】:
我是 C++ 新手。这是我的作业,下面是教授给我们的代码,以帮助我们完成这项任务,但它没有编译...我已经标记了生成错误的行,错误消息是
“不能在没有模板参数列表的情况下引用模板‘哈希’”。
我不知道如何解决它。有人可以指出我正确的方向吗?
(我已经删除了我认为与错误消息无关的行。)
类定义为:
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 );
---和cpp文件中的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;
}
【问题讨论】:
-
你是
abusing namespace std;。停下来。现在停止它,而你仍然可以。如果一切都失败了,请寻求专业帮助。这不是犯罪,不会让你成为坏人,我们都在这里支持你。 -
你可能想把你的函数声明放在你第一次使用它们的地方(现在你可能指的是std::hash,这正是你不应该使用@987654324的原因@)。而且您没有
int hash(const string& key);的定义。身份对于整数来说是一个糟糕的哈希函数。此外,您的哈希函数似乎根本不依赖于您的表容量,这对我来说似乎有些奇怪。 -
@KerrekSB
using namespace std;(或任何其他命名空间)没有任何问题,只要您在源文件中而不是在头文件中进行。期望人们总是用 std:: 限定每个库名称是荒谬的。对于具有 System.Windows.Controls 之类的命名空间的 C#,您会说同样的话吗?期望人们不在头文件中这样做甚至是荒谬的,但这确实会带来问题(这是 C++ 过时的模块系统的错)。 -
@user1610015:C++ 语言是否“应该”更像 C# 并不重要,如果程序员不考虑他们实际编写的语言,那么他们已经一个错误。这是他们的错。我并不总是用
std来限定每个库名称,我也不使用using namespace std;,所以你提出了错误的二分法。即使你的二分法是真实的,即使 C++ 语言对程序员的要求是荒谬的,你仍然必须满足这些要求,否则你的 C++ 代码将是错误的。我更喜欢正确的荒谬代码而不是错误的合理代码。 -
@SteveJessop 我没有说 C++ 应该更像 C#。提到 C++/CLI 和 System::Windows::Controls,我本可以提出同样的观点。即使在本机 C++ 中,您也可以在自己的代码或第三方库中拥有长命名空间。命名空间在所有支持它们的语言(C++、C#、C++/CLI、VB.NET 和 Java 中的包)中几乎相同。至于不符合 std:: 也不写
using namespace std;,我猜你的意思是使用using和特定项目(using std::string)。这比限定它们更可笑(如果你只使用该物品一次呢?)。
标签: c++ xcode class templates arguments