【问题标题】:Cannot refer to class template without a template argument list不能在没有模板参数列表的情况下引用类模板
【发布时间】: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&amp; 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


【解决方案1】:

我怀疑你是 using namespace std;(我可以知道,因为你使用的是 vector 而没有 std::)并且在 std 命名空间中存在名称 hash,因此名称冲突。

你应该使用std::而不是引入整个std命名空间,尤其是在一个无辜的用户可以#include它并用std污染他们的程序的头文件中.

【讨论】:

  • 名称冲突!谢谢你,赛斯! :)
  • 如果你经常提到vector这个名字并且想要缩写它,你也可以使用using std::vector;。这样可以避免将数百个其他名称拖入您从未听说过的范围内。
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2021-07-05
相关资源
最近更新 更多