无法在C++中调用超载<<运算符

问题描述:

我已经在这里读过几个线程,并认为我已经相应地设置了它。我相信问题在于我使用*,并且我没有正确设置超载设置,即 - 参数定义不正确。问题是编译和运行成功,所以我不知道我犯了什么错误。无法在C++中调用超载<<运算符

我真的很抱歉,如果这之前已被回答,但我找不到它。

#include <iostream> 
#include <vector> 
#include <fstream> 
#include <string> 
#include <list> 
#include <exception> 

using namespace std; //Allows us to not prepend std:: to many things. 

template<class t> 
class HashingTable 
{ 
public: 
    HashingTable(); 
    HashingTable(int size); 
    void insert(const char *x); 

private: 
    int x = 0; 
    vector<list<const char *>> hashedLists; 
    int currentSize; 
    int hash(const char * key); 

friend std::ostream& operator << (std::ostream & os, const HashingTable<t>); 
}; 

template<class t> std::ostream& operator<< (ostream & os, const HashingTable<t> &ht) 
{ 
    const int listSize = ht.size(); 
    for (unsigned int i = 0; i < listSize; i++) 
    { 
     list<const char *> searchList = ht[i]; 
     for (std::list<const char *>::const_iterator si = std::next(searchList.begin(), listSizeLimit); si != searchList.end(); ++si)  //for each value in hashed list. 
      cout << *si << " "; 
    } 

    return os; 
}; 

template<class t> 
int HashingTable<t>::hash(const char * key) { 
    return key[0] - 'A'; 
}; 

template<class t> 
HashingTable<t>::HashingTable(int size) 
{ 
    hashedLists.resize(size); 
}; 

template<class t> 
HashingTable<t>::HashingTable() 
{ 
    hashedLists.resize(0); 
}; 

template<class t> 
void HashingTable<t>::insert(const char *x) { 
    //string tempStr(x); 
    unsigned int hashVal = hash(x); 

    if (hashedLists.size() < (hashVal + 1)) //if the number of lists in the current vector is less than the resize value then... 
     hashedLists.resize(hashVal + 1); //resize the hashedLists vector  

    list<const char *> iList = hashedLists[hashVal]; 
    if (std::find(iList.begin(), iList.end(), x) == iList.end()) 
    { 
     iList.push_back(x); 
     hashedLists[hashVal] = iList; 
    } 

    currentSize++; 
}; 


int main() /* A sample main program */ 
{ 
    HashingTable<char*>* mht; 
    char* Names[25] = { "AB", "AC", "AE", "AZ", 
     "BA","BM", "BJ", "BZ", 
     "CA", "CX", "CZ", "CZZ", 
     "EJ", "EP", "EF", "ES", 
     "QW", "QE", "QR", "QD", 
     "SA", "SD", "SF", "SS", "SJ" }; 
    int i; 
    mht = new HashingTable<char*>(0); 

    for (i = 0; i < 25; i++) 
     (*mht).insert(Names[i]); 
    cout << "Printing the hash table after inserting...." << endl; 
    cout << *mht; 
    cout << endl; 

    return 0; 
} 

感谢您的任何见解。

+1

没有“snippets”。出示您的[MCVE]。 –

+0

我现在正在代码中做的另一件事是加载数组。我添加了它。谢谢。 – thePetester

+1

这不是完整的代码,请阅读上面评论中的链接并修复它。重构代码以生成包含所有代码的单个文件,显示所有包含的内容以及诸如“正在使用命名空间标准”这样的内容。我们应该能够复制您显示的代码,将其粘贴到编辑器中并进行编译。在那之前试图回答这是浪费时间。 –

在:

cout << (mht); 

的不必要的括号mhtHashingTable<char*> *类型。您提供了operator<<的超负荷,需要HashingTable<T> const&。那些不一样,所以你的超载不被考虑。

你的意思是:

cout << *mht; 
+0

谢谢。我试过了,但是我得到了一个“无法解析的外部错误”,我认为这意味着编译器无法找到被调用的函数。 – thePetester

+1

这意味着编译器无法找到被调用函数的定义。如果它是一个模板,那么定义应该在标题中。 –

+0

是的,但这是因为我错误地调用它吗?换句话说,因为我没有正确定义它?我有一个头文件。 – thePetester

朋友的声明是相当无用的,实际上是有害。它与实际的函数体不匹配,所以它不会帮助它找到或给予私人成员额外的访问权限,并且它将在重载解析期间与定义的操作符竞争。

当朋友确实被选中时,编译器会发出对从不拥有主体的函数的调用,从而导致无法解析的外部错误。

这种类型的朋友声明声明了一个系列非模板函数在封闭名称空间中。没有语法来定义它们。

删除好友声明。或者以内联方式移动主体,在这种情况下,您还应该将第二个参数修复为常量引用,而不是副本。

当你开始调用你写的操作符函数体时,你会得到其他错误,如ht.size()不存在。不要认为这些错误意味着你对操作符的使用是错误的 - 它们实际上意味着你的使用是正确的,编译器现在正试图解析操作符函数体中的依赖名称。

+0

谢谢。我会试试这个。我离开了公司,离开了我的个人笔记本电脑。我将在调试这个休息时工作。 谢谢! – thePetester