【问题标题】:c++ template problemc++模板问题
【发布时间】:2011-04-10 20:15:16
【问题描述】:

我有一个具有其他用途的模板的类:

template<class t>
class MyClass {
    public: //of course public...
    t foo;
    std::string text;
}

我有另一个类,该类通过参数获取所有这些类,并希望将指针存储在数组中。该类不想只访问类的特定(模板化)部分,而是访问公共属性/方法。

class Container {
    public: //of course public...
    MyClass* array; //this is allocated with some magic.
    void bar(MyClass& m) {
      and want to store the class in a MyClass* array.
    }
}

这是模板参数列表丢失

的错误

我该如何解决这个问题?

【问题讨论】:

    标签: c++ class templates


    【解决方案1】:

    最简单的方法是将该函数也设为模板:

    template <class t>
    void bar(MyClass<t>& m) {
        // ...
    }
    

    请注意,这可能应该是const MyClass&lt;t&gt;&amp;,因为您不需要修改它。


    您的新代码毫无意义。不存在MyClass 类型的对象,因为MyClass 是一个模板。如果您想对这些类进行操作而不考虑它们的模板参数,那么您需要将非模板部分分解为基类:

    class MyClassBase
    {
    public:
        // polymorphic base classes should always have virtual destructors
        ~MyClassBase() {}
    
        virtual void some_function() = 0;
    };
    
    template <typename T>
    class MyClass : public MyClassBase
    {
    public:
        // implement abstract functions
        void some_function()
        {
            // template argument T is available here
        }
    };
    

    然后你可以引用那个base,当你调用一个虚函数时它会动态调度:

    class Container
    {
    public:
        // no magic: use a std::vector for dynamic arrays
        std::vector<MyClassBase*> array; // not by value! avoid slicing
    
        void bar(MyClassBase& m)
        {
            array.push_back(&m);
        }
    
        void baz()
        {
            array[0]->some_function(); // for example
        }
    };
    

    【讨论】:

    • 编译器告诉您,您必须将模板参数传递给MyClass
    • 抱歉,这并不正确,因为另一个类方法需要访问 MyClass 属性,这是我的错误,我没有这么说。我会在一秒钟内更新我的 q
    【解决方案2】:

    放置一个通用的基类怎么样。

    class MyClassCommon {
    protected:
        ~MyClassCommon() { }
    
    public:
        std::string text;
    };
    
    template<class t>
    class MyClass : public MyClassCommon {
    public: // of course public...
        t foo;
    };
    
    class Container {
    public: // of course public...
        MyClassCommon* array; // this is allocated with some magic.
        void bar(MyClassCommon& m) {
            /* ... */
        }
    };
    

    【讨论】:

    • 没看到你加了这个,不是故意踩脚的。
    • 也感谢您的回答。我为这个不错的答案投票赞成你,但我更了解 GMan 的答案。
    【解决方案3】:

    如果要创建“多模板”数组,最好使用非模板类作为模板类的基类。或者你可以制作一个模板数组并在其中存储任何对象。

    【讨论】:

      【解决方案4】:

      你的类中的文本变量是私有的,所以除非你的 bar 函数是类的方法,否则你不能像那样合法地使用它

      【讨论】:

      • 很好的观察,但我认为我们可以假设这是一个错字。 :)
      猜你喜欢
      • 2017-02-14
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多