проблема шаблона c ++ - PullRequest
1 голос
/ 11 апреля 2011

У меня есть класс, у которого есть шаблон для других целей:

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 ]

5 голосов
/ 11 апреля 2011

Самый простой способ - сделать эту функцию шаблоном:

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
    }
};
3 голосов
/ 11 апреля 2011

Как насчет размещения общего базового класса.

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) {
        /* ... */
    }
};
1 голос
/ 11 апреля 2011

Если вы хотите создать «мульти-шаблонный» массив, вам лучше использовать не шаблонный класс в качестве базового класса шаблонного класса. Или вы можете создать массив шаблонов и хранить в нем любые объекты.

0 голосов
/ 11 апреля 2011

текстовая переменная в вашем классе является закрытой, поэтому, если вы не запретите функцию, это метод класса, вы не можете использовать его легально таким образом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...