我在模板類中有一個創建變數哈希的方法。我已經將它的模板專門用于 int、double 和 std::string 像這樣
template<>
class Hash<int>
{
public:
unsigned long operator()(const int& d) const noexcept
{
return d * d;
}
};
template<>
class Hash<double>
{
public:
unsigned long operator()(const double& d) const noexcept
{
long intera = floor(d);
long frazionaria = pow(2, 24) * (d - intera);
return intera * frazionaria;
}
};
template<>
class Hash<std::string>
{
public:
unsigned long operator()(const std::string& d) const noexcept
{
unsigned long hash = 5381;
for (unsigned long i = 0; i << d.length(); i )
{
hash = (hash << 5) d[i];
}
return hash;
}
};
然后,我創建了相同方法的通用版本,它采用模板引數并嘗試將其轉換為 std::string,然后嘗試對其呼叫 operator() (我希望將其稱為專用模板)
unsigned long operator()(const Data& d) const noexcept
{
std::cout<<"Special hash! ";
void *v = (void *)&d;
size_t j = sizeof(d);
std::string s = "";
for (size_t k = 0; k < j; k )
{
s = (((char *)v)[k]);
}
std::cout<<"Pre-hash: "<<s<<std::endl;
return operator()(s);
}
(它在類宣告中,而其他 3 個在不同的檔案中)所以當我在 int、double 或 std::string 上呼叫 Hash 類的 operator() 時它作業正常,但是當我嘗試呼叫它時我的另一類我收到此錯誤:
error: cannot convert ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} to ‘const lasd::BST<int>&’
35 | return operator()(s);
| ^
| |
| std::string {aka std::__cxx11::basic_string<char>}
所以在我看來,它試圖再次呼叫 operator(BST),即使我已經向它傳遞了一個字串。有沒有辦法解決這個問題?我不在乎散列函式不正確,我有一個這樣的分配,我只需要了解是否可以從普通模板呼叫專門的模板函式。我也嘗試過使用
return operator()<std::string>(s);
正如我在類似問題的其他一些答案中看到的那樣,但我收到以下錯誤:
error: expected primary-expression before ‘>’ token
35 | return operator()<std::string>(s);
| ^
https://gcc.godbolt.org/z/9oz8Gf9aM
uj5u.com熱心網友回復:
如果我理解正確,您operator()需要一個Hash實體來呼叫它的專用operator()
auto operator()(const Data& d) const noexcept
{
// ....
std::string s = "";
return Hash<std::string>{}.operator()(s);
// ^^^^^^^^^^^^^^^^^^^
// OR simply
// return Hash<std::string>{}(s);
}
更新
從更新的發布/錯誤訊息中,您正在使用特化,Hash<std::string>然后才宣告和定義它。那就是:
return Hash<std::string>{}(s);
Hash編譯器不知道std::string. 因此,錯誤!
(一種方法)要修復它,您需要將宣告和定義拆分如下:
template<typename Data> class Hash
{
public:
// declare the operator()
auto operator()(const Data& d) const noexcept;
};
template<> class Hash<int> { /* ...code... */ };
template<> class Hash<double> { /* ...code... */ };
template<> class Hash<std::string> { /* ...code... */ };
// define the operator()
template<typename Data>
auto Hash<Data>::operator()(const Data& d) const noexcept
{
// code!
return Hash<std::string>{}(s);
}
查看演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486496.html
上一篇:(MSVC)在類外實作模板類的模板方法時,C2244:無法將函式定義與現有宣告匹配
下一篇:匹配模板模板型別引數
