Ошибка C ++, создаваемая отсюда при использовании шаблонов - PullRequest
0 голосов
/ 29 июля 2011
template<class Concept> class OMAbstructContainer 
{ 
    friend class OMIterator<Concept> ;

    // ...
};

template<class Concept> class OMStaticArray :
            public OMAbstructContainer<Concept> {
protected:
    Concept *theLink;
    int count;

    void* AllocateMemory(int size);
    bool  ReleaseMemory(void* pMemory);
public:
    // Constructor
    OMStaticArray(int size): count(0) 
    {
        theLink = NULL;
        theLink = (Concept*) this->AllocateMemory(size); 
    }
}; 


template<class Concept> class OMCollection :
    public OMStaticArray<Concept>{
public:
    // Constructor
    OMCollection(int theSize=20):
      OMStaticArray<Concept>(theSize) { 
        size = theSize;
    }

    // Destructor   
    ~OMCollection() { } // The link is delete in ~OMFixed()

    //...
};

Теперь я использую вышеуказанную коллекцию, как показано ниже

class MyVar
{
public :

    // Constructors and destructors:
    MyVar(int Index) { }

    // ...
};

OMCollection<MyVar*> m_pCollVars;

Когда я запускаю код выше в компиляторе C ++ vxworks6.8, я получаю следующую ошибку

error: instantiated from 'OMStaticArray<Concept>::OMStaticArray(int) [with Concept = MyVar*]'

У меня много ошибок, как указано выше. Код, используемый для правильной компиляции с использованием компилятора VxWorks 5.5.

У меня следующая ошибка ошибка: создается из 'OMCollection :: OMCollection (int) [with Concept = MyVar *]'

Я получаю следующую строку: OMCollection (int theSize = DEFAULT_START_SIZE): OMStaticArray (theSize) { размер = размер; }

Понятия не имею, почему я сталкиваюсь с этими ошибками, может ли кто-нибудь помочь мне, как это можно исправить.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 января 2013

Вы используете IBM Rhapsody, верно?Контейнеры, предоставляемые Rhapsody, являются «ссылочными контейнерами», но параметр шаблона должен быть тем классом, на который должны указывать контейнеры, а не указателем на класс.

Например

class Foo {...};

OMColloction< Foo > myFooCollection;

Это то, что вы хотите.

Примечание: все контейнеры Rhapsody должны быть созданы с классом, не являющимся фундаментальным типом, поскольку 0 - допустимое значение для типа фонда, но маркер конца контейнера для ссылочных контейнеров.

0 голосов
/ 29 июля 2011

Нет видимых ошибок в вашем вопросе. Я вижу одну проблемную вещь в том, что вы создаете экземпляр OMStaticArray<Concept>, где Concept = MyVar*; так,

Concept *theLink; ==> MyVar **theLink;

Теперь ваш AllocateMemory() возвращает void*;

Вы уверены, что хотите конвертировать void* в MyVar**? Из-за кастинга в стиле C вы не замечаете этого, но это утверждение не убедительно.

...