gdw66 2021-03-01 15:19 采纳率: 0%
浏览 30

使用c++编写一个类模板及其特化类,测试报错

#include <exception>
#include <stdexcept>
#include <string>
#include <iostream>

using namespace std;

//类模板
template <typename T>
class DefaultHash {
public:
    DefaultHash(size_t mNumBuckets = 101) throw(invalid_argument);
    size_t hash(const T& key) const;
    size_t numBuckets() const{return  mNumBuckets;}

protected:
    size_t mNumBuckets;
};


template<typename T>
DefaultHash<T>::DefaultHash(size_t numBuckets) throw(invalid_argument){
    if (numBuckets<=0) {
        throw invalid_argument("numBcukets must be > 0");
    }
    mNumBuckets = numBuckets;
}

template<typename T>
size_t  DefaultHash<T>::hash(const T& key) const{
    size_t bytes=sizeof(key);
    size_t res=0;
    for (size_t i=0; i<bytes; ++i) {
        unsigned char b=*((unsigned char*)&key+i);
        res+=b;
    }
    return res % mNumBuckets;
}

//模板特化为string类型

template<>
class DefaultHash<string>{

public:
    DefaultHash(size_t numBuckets=101) throw(invalid_argument);
    size_t hash(const string& key) const;
    size_t numBuckets() const{return  mNumBuckets;}
protected:
    size_t mNumBuckets;

};


DefaultHash<string>::DefaultHash(size_t numBuckets) throw(invalid_argument)
{
    if (numBuckets<=0) {
        throw invalid_argument("numBcukets must be > 0");
    }
    mNumBuckets = numBuckets;
}

size_t DefaultHash<string>::hash(const string& key) const{

    size_t sum=0;
    for (size_t i=0; i< key.size(); ++i) {
        sum += (unsigned char)key[i];

    }

    return sum % mNumBuckets;
}

//测试函数

void testDefaultHash(){

    DefaultHash<int> myIntHash(500);
    cout<<myIntHash.hash(100)<<"  ";


    DefaultHash<string> myStringHash(500);
    cout<<"key=yht:"<< myStringHash.hash("yht")<<" "<<endl;
    cout<<"mNumBuckets="<<myStringHash.numBuckets()<<endl ;
}

在main函数中调用testDefaultHash(),单独测试特化的模板类不报错,测试模板类时报下面错误:

Undefined symbols for architecture x86_64:

  "DefaultHash<int>::DefaultHash(unsigned long)", referenced from:

      testDefaultHash() in TestHeader.o

  "DefaultHash<int>::hash(int const&) const", referenced from:

      testDefaultHash() in TestHeader.o

  • 写回答

1条回答 默认 最新

  • gdw66 2021-03-02 12:18
    关注

    把DefaultHash <typename T>类模板的声明和实现放在都放在.h文件中,就可以了.

    评论

报告相同问题?

悬赏问题

  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题