【问题标题】:Using struct as a type in a C++ template?在 C++ 模板中使用 struct 作为类型?
【发布时间】:2022-03-02 16:14:19
【问题描述】:

我有这样的功能

template <typename T>
double vectortest(int n, bool prealloc) {
std::vector<T> tester;
    std::unordered_set<T> seq = generatenums<T>(n);
}

其中 generatenums 是另一个模板化函数

template <typename T>
std::unordered_set<T> generatenums(int n) {
  std::unordered_set<T> ret;
}

请注意:我已经截断了这些函数的全部内容,只留下了我认为与我的问题相关的内容。

我也有一个结构

typedef struct Filler
{
    int value;
    int padding[2500];
};

我希望能够像这样调用我的函数

vectortest<Filler>(5, true);

但这会产生很多错误,让我想知道为什么我不能使用 struct 作为 C++ 模板的类型,是否有办法解决这个问题?

【问题讨论】:

  • 首先,typedef 关键字不属于那里。去掉它。然后它已经在std::unordered_set&lt;Filler&gt; 失败了。 std::unordered_set 要求您定义 operator==std::hash 特化。那么你的vectortestgeneratenums 都缺少return 语句并且不知道tester 的用途。
  • 这能回答你的问题吗? How can I use a C++ unordered_set for a custom class?C++ unordered_map using a custom class type as the keyunordered_setunordered_map 要求相同)
  • 您忘记为typedef 添加新别名。总是值得阅读错误的内容。
  • C++ 的错误消息可能非常可怕,尤其是使用模板时。阅读它们的方法是滚动到错误的最顶部,only 读取并处理第一个错误。然后再试一次。大多数“大量错误”是第一个错误的结果,如果你愿意的话,有点“涓涓细流”。

标签: c++


【解决方案1】:

unordered_set on structs 需要自定义哈希函数。

同样uset on structs 需要比较 &lt;operator 来定义。

#include <iostream>
#include <vector>
#include <unordered_set>


// class for hash function
template <typename T>
struct MyHashFunction {
    // id is returned as hash function
    size_t operator()(const T& f) const
    {
        return f.id;
    }
};

template <typename T>
double vectortest(int n, bool prealloc) {
std::vector<T> tester;
    std::unordered_set<T,MyHashFunction<T>> seq = generatenums<T>(n);
    return 73.0;
}

template <typename T>
std::unordered_set<T,MyHashFunction<T>> generatenums(int n) {
  std::unordered_set<T,MyHashFunction<T>> ret;

  return ret;
}

struct Filler
{
    int id;
    int value;
    int padding[2500];
};



int main(){
  
    
    vectortest<Filler>(5, true);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多