gpt4 book ai didi

c++ - 奇怪的无序 map 情况

转载 作者:太空狗 更新时间:2023-10-29 20:46:25 26 4
gpt4 key购买 nike

我有一个与类(class)共享的图书馆:

// HPP:
class WorldSettings
{
private:
static std::unordered_map<std::string, int> mIntegerStorage;
static std::unordered_map<std::string, float> mFloatStorage;
static std::unordered_map<std::string, std::string> mStringStorage;

public:
template <typename T>
static T &Get(const std::string &key);

template <typename T>
static T &Set(const std::string &key, T value);
};

//消费者购买力:

#define DoReturn(MapName, Key, Type) {                                                \
assert( MapName.find(Key) != MapName.end() && "No such key in world settings!" ); \
return MapName[Key]; \
} \

#define DoSetup(MapName, Key, Value) { \
MapName[key] = Value; \
return MapName[Key]; \
} \

std::unordered_map<std::string, int> WorldSettings::mIntegerStorage;
std::unordered_map<std::string, float> WorldSettings::mFloatStorage;
std::unordered_map<std::string, std::string> WorldSettings::mStringStorage;

// Getters

template <>
int &WorldSettings::Get<int>(const std::string &key)
{
DoReturn(mIntegerStorage, key, int);
}

template <>
float &WorldSettings::Get<float>(const std::string &key)
{
DoReturn(mFloatStorage, key, float);
}

template <>
std::string &WorldSettings::Get<std::string>(const std::string &key)
{
DoReturn(mStringStorage, key, std::string);
}

// Setters

template <>
int &WorldSettings::Set<int>(const std::string &key, int value)
{
DoSetup(mIntegerStorage, key, value);
}

template <>
float &WorldSettings::Set<float>(const std::string &key, float value)
{
DoSetup(mFloatStorage, key, value);
}

template <>
std::string &WorldSettings::Set<std::string>(const std::string &key, std::string value)
{
DoSetup(mStringStorage, key, value);
}

现在我想在非共享库(简单控制台应用程序)中使用此类:

WorldSettings::Get<int>("WorldMinutes");

'WorldMinutes' 在共享库代码中设置:

WorldSettings::Set<int>("WorldMinutes", 0);

问题是:

Floating point exception

Program received signal SIGFPE, Arithmetic exception.
0x00000000004d1f61 in std::__detail::_Mod_range_hashing::operator() (this=0x747863, __num=732984944481197501,
__den=0) at /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../include/c++/4.6.2/bits/hashtable_policy.h:376
376 { return __num % __den; }

回溯:

#0  0x00000000004d1f61 in std::__detail::_Mod_range_hashing::operator() (this=0x747863, __num=732984944481197501, 
__den=0) at /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../include/c++/4.6.2/bits/hashtable_policy.h:376
#1 0x00000000004d3503 in std::__detail::_Hash_code_base<std::string, std::pair<std::string const, int>, std::_Select1st<std::pair<std::string const, int> >, std::equal_to<std::string>, std::hash<std::string>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index (this=0x747860, __c=732984944481197501, __n=0)
at /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../include/c++/4.6.2/bits/hashtable_policy.h:758
#2 0x00000000004d2a9a in std::__detail::_Map_base<std::string, std::pair<std::string const, int>, std::_Select1st<std::pair<std::string const, int> >, true, std::_Hashtable<std::string, std::pair<std::string const, int>, std::allocator<std::pair<std::string const, int> >, std::_Select1st<std::pair<std::string const, int> >, std::equal_to<std::string>, std::hash<std::string>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true> >::operator[] (this=0x747860, __k=...)
at /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../include/c++/4.6.2/bits/hashtable_policy.h:543
#3 0x00000000004d1cfa in WorldSettings::Set<int> (key=..., value=0)

Set<int>(...) 时调用错误在共享库代码中。有趣的是,我在调用 Get 时没有出现错误。来自库代码。这里可能出了什么问题?

最佳答案

代码是不正确的。

您在 .cpp 文件中定义的特化应该已经在 .hpp 文件中声明(在类之外),否则任何时候您尝试使用定义的函数都会有未定义的行为。

添加:

template <>
int &WorldSettings::Get<int>(const std::string &key);

template <>
float &WorldSettings::Get<float>(const std::string &key);

template <>
std::string &WorldSettings::Get<std::string>(const std::string &key);

// Setters

template <>
int &WorldSettings::Set<int>(const std::string &key, int value);

template <>
float &WorldSettings::Set<float>(const std::string &key, float value);

template <>
std::string &WorldSettings::Set<std::string>(const std::string &key, std::string value);

在类定义之后。

这告诉编译器定义是在别处生成的。

实际上,共享库很可能会生成自己的函数拷贝(您是否提供了一些默认模板实现?),这可能会造成严重破坏。

这可能不是错误的原因,但进一步调查没有意义。

关于c++ - 奇怪的无序 map 情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8286103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com