C ++ Сборка мусора, шаблоны и переопределение операторов - не могу понять, почему он выдает ошибку - PullRequest
0 голосов
/ 06 января 2011

Я пытаюсь скомпилировать файл, который определяет шаблон сборки мусора и несколько вспомогательных классов с использованием перегрузки операторов. Я пытался запустить это через MSVC ++ 2008, и компиляция останавливается на этом конкретном классе:

// (The collector defines gc_object_generic_base which
// inherits from gc_object_generic_base and optionally adds
// collector-specific properties.)

template<class garbage_collector>
class gc_object_base : public garbage_collector::gc_object_collector_base {
public:
    gc_object_base() {
        garbage_collector::constructing_gc_object_base(this);
    }

    static void* operator new(size_t sz,
        block_construction_locker_base* lock = block_construction_locker<garbage_collector>().get_this())
    {
        return garbage_collector::allocate(sz, lock);
    }
    static void operator delete(void* p, block_construction_locker_base* lock) {
        return garbage_collector::deallocate(p);
    }
    static void operator delete(void* p) {
        return garbage_collector::deallocate(p);
    }

private:
    // TODO: are arrays worth implementing?
    static void* operator new[](size_t sz) {
        assert(0);
        return 0;
    }
};

Сокращенный вывод для краткости:

2>------ Build started: Project: Test, Configuration: Debug Win32 ------
2>Compiling...
2>FlashTest.cc
2>C:\test\gameswf\base\tu_gc.h(133) : error C2059: syntax error : 'string'
2>        C:\test\gameswf\base\tu_gc.h(151) : see reference to class template instantiation 'tu_gc::gc_object_base' being compiled
2>C:\test\gameswf\base\tu_gc.h(135) : error C2091: function returns function
2>C:\test\gameswf\base\tu_gc.h(135) : error C2802: static member 'operator new' has no formal parameters
2>C:\test\gameswf\base\tu_gc.h(135) : error C2333: 'tu_gc::gc_object_base::operator new' : error in function declaration; skipping function body

Есть идеи, с чего мне начать смотреть?

Ответы [ 3 ]

2 голосов
/ 29 октября 2012

У меня просто была такая же схема ошибок в другом проекте. Кажется, это происходит, когда кто-то где-то сделал это:

#define new new(someArgs, someMoreArgs, etc)

Он нацелен на простые «новые» выражения, но ломается, если кто-то пытается объявить больше «новых операторов».

1 голос
/ 06 января 2011

В открывающих строках

template<class garbage_collector>
class gc_object_base : public garbage_collector::gc_object_collector_base {

здесь дважды отображается garbage_collector, один раз как параметр шаблона, а другой как внешний класс для gc_object_collector_base, но поскольку это параметр шаблона, для него не требуется "typename"вот так:

template<class garbage_collector>
class gc_object_base : public typename garbage_collector::gc_object_collector_base {
0 голосов
/ 06 января 2011

В вашем коде нет упоминания о string, что я вижу.Но я хотел бы начать с того, что сначала вы должны #include <string> до делкарации класса, а затем убедитесь, что вы используете std::string в качестве декларатора, а не просто string.

...