c ++模板问题

时间:2011-04-10 20:15:16

标签: c++ class templates

我有一个类,其中有一个模板用于其他目的:

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.
    }
}

这是缺少模板的参数列表

的错误

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

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

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

请注意,这应该是const MyClass<t>&,因为您无需修改​​它。


您的新代码毫无意义。没有像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
    }
};

然后你可以参考那个基础,当你调用虚函数时它会动态调度:

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
    }
};

答案 1 :(得分:3)

如何建立一个共同的基类。

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) {
        /* ... */
    }
};

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你的类中的text变量是私有的,所以除非你的bar函数是一个类的方法,你不能合法地使用它