我今天遇到了一个奇怪的问题,我并没有完全理解。希望这里有人能够提供帮助。
情况比较简单。我有一个类,其中有一个静态成员是std::set类型。该类有两个模板构造函数,它们只在参数数量上有所不同。它们的行为相同,因此请注意构造函数是模板化的,并且构造函数正在搜索和插入std::set。
我遇到了以下行为: 对于该类的静态实例,在调用静态std::set的第一个方法(find())时,构造函数会崩溃。看起来set未被初始化。我认为构造函数在静态成员变量初始化之前被调用。
这里是一个简化的示例:
情况比较简单。我有一个类,其中有一个静态成员是std::set类型。该类有两个模板构造函数,它们只在参数数量上有所不同。它们的行为相同,因此请注意构造函数是模板化的,并且构造函数正在搜索和插入std::set。
我遇到了以下行为: 对于该类的静态实例,在调用静态std::set的第一个方法(find())时,构造函数会崩溃。看起来set未被初始化。我认为构造函数在静态成员变量初始化之前被调用。
这里是一个简化的示例:
////////// Header File
class ConVar : public IListener
{
friend EventHandler; // Event Handler auto registers all instances of convar to commands
public: // Auto
template< typename T >
ConVar(string const& name, string const& description, T const& default_value );
private:
static std::set<u32> mRegisteredVars;
};
//////// INL file (included from header)
template< typename T >
ConVar::ConVar(string const& name, string const& description, T const& default_value )
: mName(name),
mhName(name),
mDescription(description),
mClamp(false)
{
u32 hname = CONSTHASH(name.c_str());
ErrorIf(mRegisteredVars.find(hname) != mRegisteredVars.end(), "Attempt to create same ConVar multiple times. Note the ConVars are static singletons!");
*this = default_value;
mRegisteredVars.insert(hname);
gCore.Events.Subscribe(mhName, this);
}
///////////// .cpp file
std::set<u32> ConVar::mRegisteredVars;
崩溃发生在find方法的ErrorIf中。如果我注释掉那行,它会在插入行崩溃。
构造函数在main之前被调用(类的静态实例)。 有人知道这里可能出了什么问题吗?
ConVar<T>
的对象? - Martin York