Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > error: partial specialization after instantiation


Автор: boostcoder 26.4.2012, 10:55
всем бодрого!

http://www.chaoticmind.net/~hcb/projects/boost.atomic/doc/index.html.

использовал с версией 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/703f4e17de6140bd62341de99dadddf9
получаю такую ошибку:
Цитата

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;
    }
};



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

благодарен.

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

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


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