【发布时间】:2013-08-07 12:05:36
【问题描述】:
我真的在为 C++ 中的一个问题而苦苦挣扎,我真的很沮丧:
问题是当我在编码时没有错误,一切看起来都很好(我使用的是 Vs2012)但是当我尝试编译它时有很多错误,这取决于我如何改变代码。
我真的无法让它工作,我希望你能帮助我,这对专家来说应该很容易!这基本上是我的一些代码,所有包含的内容都是 finde 并且项目设置正确:
class someclass //that stores the references
{
public:
// ..........
template <typename T>
T* getComponent(string name)
// headers and cpp files are actually seperated
{
auto itr = _map.find(name);
if (itr == _map.end())
return 0;
return dynamic_cast<T*>(itr->second);
}
private:
unordered_map<string, Baseclass*> _map;
}
我试图称呼它的方式类似于:
DerivedFromBase* d = someclass->getComponent<DerivedFromBase>("derived");
我不知道我是否误解了模板非常糟糕,或者我离解决方案仅一步之遥,这就是我在这里发布我的问题的原因,我希望专家给我一个提示。 我只是想稍微润色一下我的代码,没有模板,它看起来像这样(并且有效):
class someclass
{
Base* getComponent(string) //...
};
我叫它的方式是:
Derived* d = (Derived*) someclass->getComponent(name);
这确实有效,但我认为模板的概念会更好,但同样,我不知道我是否误解了它。提前感谢您的任何帮助!
感谢您的提示。我真的忘记了这里的括号,但它们在我的代码中。顺便说一句,对不起我的英语不好,我希望你能理解我的意思;)我是否必须转换为 T 或 T* (实际的返回类型或者演员是否已经给了我一个 T* 以便我在 T* 中的演员实际上会导致T*? 我在我的 cpp 和我的头文件中都有模板的定义,这可能是错误,因为当我将它留在 c++ 文件中时,它会显示类似“未知类型说明符 T”的内容,但是如果我把它放在我的 .h 文件的顶部,我的整个类都被认为是一个模板类(这不是我想要的,因为我需要几个不同类型的派生类(lkie derived1、derived2* 等) ). 我希望这在某种程度上有用,再次感谢所有的努力!
【问题讨论】:
-
你遇到了什么错误?
-
顺便说一句,模板实现必须在头文件中,而不是在 cpp 文件中(当然,除非它是只在那里使用的特化)。
-
别忘了括号:dynamic_cast
(itr->second); -
谢谢,但是我如何放置模板
标题中的定义,我不必创建模板类,而只是函数的模板?我是否必须再次转换为 T 或 T*?我在上面的问题中添加了我的想法,如果有人可以帮助我,那就太好了! -
没有看到
Baseclass的定义,您在此处发布的代码中唯一的问题是它显示map.find而不是_map.find,这可能只是一个错字。当我自己尝试这个时,我最初得到错误 C2683,因为我没有在Baseclass中放置任何虚函数。但是当我这样做时,它编译了。你遇到了什么错误?