Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка компиляции шаблона (gcc)


Автор: bsa 7.10.2008, 16:39
Написал шаблонный класс:
Код
#include <map>
#include <string>
#include <boost/shared_ptr.hpp>
#include <stdexcept>

template <typename TBase>
class Factory
{
public:
    Factory(){}
//    template <typename TDerived>
//    inline Factory& Register (const std::string &name);

//    inline TBase* Create(const std::string &name) const;
private:
    Factory(const Factory&);
    Factory& operator=(const Factory&);

    struct CreatorBase {
        virtual ~CreatorBase(){}
        virtual TBase* create() const = 0;
    };

    template <typename TDerived>
    struct Creator : public CreatorBase {
        virtual TBase* create() const {
            return new TDerived();
        }
    };
    typedef boost::shared_ptr<CreatorBase> CreatorPtr;
    typedef std::map<std::string, CreatorPtr> Container;

    Container container_;
public:
    TBase* Create(const std::string &name) const {
        Container::const_iterator i = container_.find(name);
        if (i == container_.end())
            throw std::runtime_error("Invalid class name \"" + name + "\"");
        return i->second->create();
    }
};
При попытке собрать любым gcc (версии 4.1...4.3) возникает ошибка:
Код
$ g++ -c factory.cpp 
factory.cpp: In member function ‘TBase* Factory<TBase>::Create(const std::string&) const’:
factory.cpp:37: ошибка: expected `;' before ‘i’
factory.cpp:38: ошибка: нет декларации ‘i’ в этой области видимости
factory.cpp:40: ошибка: нет декларации ‘i’ в этой области видимости
Попробовал ради эксперимента собрать с помощью icc (Intel) - проблем нет.
Вопрос, кто виноват - я что-то накосячил или это глюк gcc?

Автор: Fazil6 7.10.2008, 17:07
Цитата(bsa @  7.10.2008,  16:39 Найти цитируемый пост)
Вопрос, кто виноват - я что-то накосячил или это глюк gcc?

Код

typename Container::const_iterator i ....

Автор: Lin07 7.10.2008, 17:09
 virtual ~CreatorBase(){} ; не надо разве?
        virtual TBase* create() const = 0;

добавлено: нет не надо

Автор: bsa 7.10.2008, 17:20
Цитата(Fazil6 @ 7.10.2008,  17:07)
Цитата(bsa @  7.10.2008,  16:39 Найти цитируемый пост)
Вопрос, кто виноват - я что-то накосячил или это глюк gcc?

Код

typename Container::const_iterator i ....

Точно! Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)