GCC 4.2 Шаблон странная ошибка - PullRequest
1 голос
/ 22 октября 2010

у меня есть следующий код, скомпилированный с GCC 4.2 / XCode.

template <typename T>
class irrProcessBufferAllocator
{
public:

    T* allocate(size_t cnt)
    {
        return allocProcessBufferOfType<T>(cnt);
    }

    void deallocate(T* ptr)
    {
        if (ptr)
        {
            releaseProcessBuffer(ptr);
        }
    }

    void construct(T* ptr, const T& e)
    {
        new ((void*)ptr) T(e);//"error: expected type-specifier before 'e' " and
//error: expected `;' before 'e'
    }

    void destruct(T* ptr)
    {
        ptr->~T();//error: expected class-name before ';' token
    }

};

Я действительно не могу понять, как исправить ошибки. пожалуйста помогите,

Спасибо.

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

Просто чтобы убедиться, что вы не пропустили, необходимо: <cstddef> для std::size_t и <new> для размещения новых?

В противном случае эти функции будут правильными. Если это весь распределитель, у него есть другие недостатки, такие как отсутствие необходимых typedefs, address() и max_size() методов, а также шаблон rebind.


Редактировать: единственная причина ошибки может заключаться в том, что у вас определен макрос в стиле функции.

#define T(z) zzz

заставит препроцессор заменить все T(), с которыми он сталкивается, но оставит T без скобок.

Вы можете просто переименовать аргумент шаблона.

0 голосов
/ 22 октября 2010

Это просто указывает на проблему, а не исправляет ее. Я специализировал шаблон для всех типов POD, удалив 'new' и '-> ~ T ()' из функций конструкции и destruct. Ошибки все еще появляются в том же месте.

0 голосов
/ 22 октября 2010

Как насчет этого?

template <class T> 
class irrProcessBufferAllocator 
{ 
public: 

    T* allocate(size_t cnt) 
    { 
        return allocProcessBufferOfType<T>(cnt); 
    } 

    void deallocate(T* ptr) 
    { 
        if (ptr) 
        { 
            releaseProcessBuffer(ptr); 
        } 
    } 

    void construct(T* ptr, const T& e) 
    { 
        new ((void*)ptr) T(e);//"error: expected type-specifier before 'e' " and 


        //error: expected `;' before 'e' 
    } 

    void destruct(T* ptr) 
    { 
        ptr->~T();//error: expected class-name before ';' token 
    } 
};

int main(){
    irrProcessBufferAllocator<int> i, j;
    int *p = new int;
    i.construct(p, 2);
    i.destruct(p);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...