Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> error: partial specialization after instantiation 
:(
    Опции темы
boostcoder
Дата 26.4.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем бодрого!

boost.atomic.

использовал с версией gcc-4.6.1 - никаких проблем не было. (либо в самой либе что-то изменили, либо фазы луны сказываются)
сейчас же, при использовании с версиями gcc-4.6.1/gcc-4.6.3/gcc-4.7.0 при компиляции такого мегапростого кода:
Код

#include <iostream>
#include <boost/atomic.hpp>

int main() {
   //std::pair<int, boost::atomic<double>> pair = std::make_pair<int, boost::atomic<double>>(1, 5.5);
   //std::pair<int, double> pair = std::make_pair<int, double>(1, 5.5);
}

http://liveworkspace.org/code/703f4e17de61...2341de99dadddf9
получаю такую ошибку:
Цитата

In file included from boost/atomic.hpp:15:0,
                 from source.cpp:2:
boost/atomic/detail/integral-casts.hpp:155:7: error: partial specialization of 'boost::detail::atomic::platform_atomic<T, 4u>' after instantiation of 'boost::detail::atomic::platform_atomic<int>' [-fpermissive]

т.к. файл boost/atomic/detail/integral-casts.hpp на офф. репозитории почему-то невиден(хотя 'git clone' стягивает и его в том числе), приведу фрагмент этого файла:
Код

template<typename T>
class platform_atomic<T, 4> : private platform_atomic_integral<uint32_t> { // 155ая строка
public:
    typedef platform_atomic_integral<uint32_t> super;
    typedef union { T e; uint32_t i;} conv;
    
    platform_atomic() {}
    explicit platform_atomic(T t) : super(to_integral(t))
    {
    }
    
    void store(T t, memory_order order=memory_order_seq_cst) volatile
    {
        super::store(to_integral(t), order);
    }
    T load(memory_order order=memory_order_seq_cst) volatile const
    {
        return from_integral(super::load(order));
    }
    bool compare_exchange_strong(
        T &expected,
        T desired,
        memory_order success_order,
        memory_order failure_order) volatile
    {
        uint32_t _expected, _desired;
        _expected=to_integral(expected);
        _desired=to_integral(desired);
        bool success=super::compare_exchange_strong(_expected, _desired, success_order, failure_order);
        expected=from_integral(_expected);
        return success;
    }
    bool compare_exchange_weak(
        T &expected,
        T desired,
        memory_order success_order,
        memory_order failure_order) volatile
    {
        uint32_t _expected, _desired;
        _expected=to_integral(expected);
        _desired=to_integral(desired);
        bool success=super::compare_exchange_weak(_expected, _desired, success_order, failure_order);
        expected=from_integral(_expected);
        return success;
    }
    
    T exchange(T replacement, memory_order order=memory_order_seq_cst) volatile
    {
        return from_integral(super::exchange(to_integral(replacement), order));
    }
    
    operator T(void) const volatile {return load();}
    T operator=(T v) volatile {store(v); return v;}    
    
    using super::is_lock_free;
protected:
    static inline uint32_t to_integral(T &t)
    {
        uint32_t tmp;
        memcpy(&tmp, &t, sizeof(t));
        return tmp;
    }
    static inline T from_integral(uint32_t t)
    {
        T tmp;
        memcpy(&tmp, &t, sizeof(t));
        return tmp;
    }
};



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

благодарен.

Это сообщение отредактировал(а) boostcoder - 26.4.2012, 11:01
PM WWW   Вверх
mes
Дата 26.4.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.4.2012,  09:55 Найти цитируемый пост)
в общем, не понятна причина ошибки.

интуитивн : где то там должна быть определена (думаю глобальная переменная) platform_atomic<int> и ее надо перенести после всех специализаций.. возможно хидеры включены не в том порядке.. 




--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.