【问题标题】:Casts in C++ with templates使用模板在 C++ 中强制转换
【发布时间】: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 中放置任何虚函数。但是当我这样做时,它编译了。你遇到了什么错误?

标签: c++ templates casting


【解决方案1】:

我认为由于 cpp 编译器完成的自动转换,会出现一些问题。

尝试使用模板(左括号)class mytype(右括号)

【讨论】:

    【解决方案2】:

    尝试将您的模板 T 定义为一个类:

    template <class T>
    

    如果没有一些可靠的错误消息,我真的无能为力,我一眼看去或多或少都可以。

    【讨论】:

    • 在大多数情况下,两者没有什么不同,但并非在所有情况下都是如此。编译器对它们的解释不同,在某些情况下,当使用其中一个时会导致逻辑错误。我不是说这是他遇到的问题,我只是建议他试试这个,看看他的错误是否与此有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多