Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用模板进行自注册的Factory模式_C++_Templates_Linker_Factory - Fatal编程技术网

C++ C++;使用模板进行自注册的Factory模式

C++ C++;使用模板进行自注册的Factory模式,c++,templates,linker,factory,C++,Templates,Linker,Factory,我的问题与年约翰的回答和斯宾塞·罗斯最近的评论一致。因为我不能在这里添加评论,所以我决定开始一个新问题 约翰的建议正是我所需要的。我以完全相同的方式实现了它,但是使用VS2008时出现了一个未解决的外部符号链接器错误,这似乎与映射有关。几天以来我一直在努力解决这个问题。今天我读了斯宾塞的评论,加上了他建议的那句话 BaseFactory::map_type BaseFactory::map = new map_type(); 到Base.hpp。现在我得到一个LNK2005错误 Derived

我的问题与年约翰的回答和斯宾塞·罗斯最近的评论一致。因为我不能在这里添加评论,所以我决定开始一个新问题

约翰的建议正是我所需要的。我以完全相同的方式实现了它,但是使用VS2008时出现了一个未解决的外部符号链接器错误,这似乎与映射有关。几天以来我一直在努力解决这个问题。今天我读了斯宾塞的评论,加上了他建议的那句话

BaseFactory::map_type BaseFactory::map = new map_type();
到Base.hpp。现在我得到一个LNK2005错误

Derivedb.obj : error LNK2005:
"private: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Base * (__cdecl*)(void),struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Base * (__cdecl*)(void)> > > * BaseFactory::map"
(?map@BaseFactory@@0PAV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6APAVBase@@XZU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6APAVBaser@@XZ@std@@@2@@std@@A)
already defined in Switcher.obj

Project.exe : fatal error LNK1169: one or more multiply defined symbols found) 
在base.hpp中,提供了一个编译器错误。删除“=0”解决了编译器错误。但现在我有另一个未解决的外部符号LNK2001错误

Derivedb.obj: error LNK2001: unresolved external symbol
"public: virtual __thiscall Base::ReadInFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)"
(?ReadInFile@Base@@UAE_NPAV@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@1@Z).

可能不清楚需要调用哪个函数(基类或子类),因为它在基类中不是抽象的???有没有办法解决这个问题?谢谢大家!

map
是STL中模板类的名称,因此变量名的选择很差。这可能与您得到的重复定义错误有关,也可能与此无关。

map
是STL中模板类的名称,因此变量名称的选择很差。这可能与您得到的重复定义错误有关,也可能与此无关。

从LNK2005错误中,您的
BaseFactory
类有一个名为
map
的静态字段,对吗

静态C++字段必须在类的头文件中“声明”,并在类的源文件中实现。

下面是一个如何设置的简化示例。在这种情况下,在
BaseFactory.h
文件中,应该声明静态字段:

class BaseFactory
{
private:
    static int map;
};
BaseFactory.cpp
文件中,实现静态字段:

int BaseFactory::map = 392;
链接器发出的错误消息表示
BaseFactory::map
静态字段已在
Derivedb.cpp
文件和
Switcher.cpp
文件中实现

即使实现(
…BaseFactory::map=…
)不在这两个文件中,如果将实现放在
BaseFactory.h
头文件中,也会出现相同的错误。C++预处理器只是盲目地包含代码头,链接器无法判断实现是否在<代码>切换器中。CPP < /C>文件或一些文件>代码>切换器。CPP < /代码>包含。


就像方法需要在
.h
文件中声明并在
.cpp
文件中实现一样,静态字段也是如此。

从LNK2005错误中,您的
BaseFactory
类有一个名为
map
的静态字段,对吗

静态C++字段必须在类的头文件中“声明”,并在类的源文件中实现。

下面是一个如何设置的简化示例。在这种情况下,在
BaseFactory.h
文件中,应该声明静态字段:

class BaseFactory
{
private:
    static int map;
};
BaseFactory.cpp
文件中,实现静态字段:

int BaseFactory::map = 392;
链接器发出的错误消息表示
BaseFactory::map
静态字段已在
Derivedb.cpp
文件和
Switcher.cpp
文件中实现

即使实现(
…BaseFactory::map=…
)不在这两个文件中,如果将实现放在
BaseFactory.h
头文件中,也会出现相同的错误。C++预处理器只是盲目地包含代码头,链接器无法判断实现是否在<代码>切换器中。CPP < /C>文件或一些文件>代码>切换器。CPP < /代码>包含。


就像方法需要在
.h
文件中声明并在
.cpp
文件中实现一样,静态字段也是如此。

错误并不模糊地意味着“有什么”是错误的。错误通常有特定的消息,如果是编译器错误,则有一行指示问题的位置。您收到了什么错误消息?你说当你有一个纯虚函数时,你遇到了一个编译器错误。在尝试实例化一个包含纯虚函数的类时,编译器是否出错?简而言之:你收到了什么信息?谢谢你的评论!现在,我试图通过添加“=0”再次获得错误,但编译器错误没有出现,而且LNK2001错误消失了。我尝试了很多东西,现在我不知道最初的原因是什么。它确实告诉我,抽象方法是不允许的。无论如何,我很高兴你的评论,因为现在至少这个错误已经解决了:-)。我仍然有LNK2005错误。现在你已经通过了第一个错误,你可以回答你的问题了。此外,编译器错误通常非常具体,但有时可能会忽略重要的细节。如果您在回答问题时包含确切的编译器错误,您将获得更好的帮助。您的问题必须包含LNK2001错误的确切文本。:)谢谢!在粘贴错误消息之前,请记住包含四个空格,这样才能正确显示
括号。错误并不含糊地表示“有什么地方”出错。错误通常有特定的消息,如果是编译器错误,则有一行指示问题的位置。您收到了什么错误消息?你说当你有一个纯虚函数时,你遇到了一个编译器错误。在尝试实例化一个包含纯虚函数的类时,编译器是否出错?简而言之:你收到了什么信息?谢谢你的评论!现在,我试图通过添加“=0”再次获得错误,但编译器错误没有出现,而且LNK2001错误消失了。我尝试了很多东西,现在我不知道最初的原因是什么。它确实告诉我,抽象方法是不允许的。无论如何,我很高兴你的评论,因为现在至少这个错误已经解决了:-)。我仍然有LNK2005的错误,现在你已经知道了
int BaseFactory::map = 392;