Пытаюсь написать простой класс получаю ошибки линьковки
От: _agg  
Дата: 30.01.18 06:33
Оценка:
Привет всем, понадобилось использовать std::vector между потоками решил сделать просто написать класс,в него добавить нужные мне методы в которых потокобезопасно будут вызываться методы вектора:
template<class T>
class safe_vector 
{
public:
    safe_vector(){}
    virtual ~safe_vector();
private:
    std::vector<T> v;    
};


Обьявляю:
safe_vector<std::string>  safe_strings;


вот такая ошибка в результате:
 error LNK2019: unresolved external symbol "public: virtual __thiscall safe_vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::~safe_vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(void)" (??1?$safe_vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@UAE@XZ) referenced in function "public: virtual void * __thiscall safe_vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::`scalar deleting destructor'(unsigned int)" (??_G?$safe_vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@UAEPAXI@Z)


Понятно что у vector куча специализаций, но как избежать этого всего, может есть какой-то прием чтобы победить ошибку?
Re: Пытаюсь написать простой класс получаю ошибки линьковки
От: night beast СССР  
Дата: 30.01.18 06:40
Оценка:
Здравствуйте, _agg, Вы писали:

_>Понятно что у vector куча специализаций, но как избежать этого всего, может есть какой-то прием чтобы победить ошибку?


поместить определение методов в hpp файл.
модулей у нас еще долго не будет.
Re: Определение
От: Qbit86 Кипр
Дата: 30.01.18 06:48
Оценка:
Здравствуйте, _agg, Вы писали:

_>Понятно что у vector куча специализаций, но как избежать этого всего, может есть какой-то прием чтобы победить ошибку?


Добавить определение объявленного деструктора.

_>
_>template<class T>
_>class safe_vector 
_>{
_>public:
_>    safe_vector(){}
_>    virtual ~safe_vector();
_>private:
_>    std::vector<T> v;    
_>};
_>


template<class T>
class safe_vector
{
public:
    safe_vector() { }
    virtual ~safe_vector() { }
    //                     ^^^
private:
    std::vector<T> v;
};
Глаза у меня добрые, но рубашка — смирительная!
Re: Пытаюсь написать простой класс получаю ошибки линьковки
От: landerhigh Пират  
Дата: 30.01.18 12:33
Оценка: +2
Здравствуйте, _agg, Вы писали:

_>Привет всем, понадобилось использовать std::vector между потоками решил сделать просто написать класс,в него добавить нужные мне методы в которых потокобезопасно будут вызываться методы вектора:


Безотносительно вопроса, на который уже дали ответ, хочу обратить внимание, что нужно очень аккуратно подходить к желанию сделать "потокобезопасный контейнер".
Попробуй представить потокобезопасную реализацию вот такого:

safe_vector::iterator where = std::find(mySafeVector.begin(), mySafeVector.end());
www.blinnov.com
Re[2]: Определение
От: _agg  
Дата: 02.02.18 04:36
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, _agg, Вы писали:


_>>Понятно что у vector куча специализаций, но как избежать этого всего, может есть какой-то прием чтобы победить ошибку?


Q>Добавить определение объявленного деструктора.


Как так я неувидел...))) СПАСИБО ВАМ БОЛЬШОЕ!!!
Re: ThreadSafeAccess
От: Erop Россия  
Дата: 08.02.18 12:08
Оценка:
Здравствуйте, _agg, Вы писали:

_>Привет всем, понадобилось использовать std::vector между потоками решил сделать просто написать класс,в него добавить нужные мне методы в которых потокобезопасно будут вызываться методы вектора:


Если уж вот прямо надо-надо такой вектор организовать или не вектор, то предлагаю рассмотреть такую штуку:

template<class T, class TSection = critical_section>
class ThreadSafeAccess {
    T& data;
    TSection& section;
public:
    ThreadSafeAccess( T& data_, TSection& section_ ) : data( data_ ), section( section_ ) { section.lock(); }
    ThreadSafeAccess( const ThreadSafeAccess& other ) : data( other.data ), section( other.section ) { section.lock(); }
    ~ThreadSafeAccess() { section.unlock(); }

    T* operator->() const { return &data; }
    T& operator * () const { return data; }
};

template<class T, class TSection>
ThreadSafeAccess<T, TSection> getThreadSafeAccess( T& data, TSection& section )
{
    return ThreadSafeAccess<T, TSection>( data, section );
}

template<class T, T* TData, class TSection>
ThreadSafeAccess<T, TSection> getThreadSafeAccessInstance(TSection& section)
{
    T* p = TData;
    if( !p ) {
        static T data;
        p = &data;
    }
    return getThreadSafeAccess( *p, section )
}
template<class T, T* TData>
ThreadSafeAccess<T, TSection> getThreadSafeAccessInstance()
{
    static critical_section section;
    return getThreadSafeAccessInstance( section )
}


использование:
// где-то в библиотеке.h
typedef ... MyVipArrayType;
inline ThreadSafeAccess<MyVipArrayType> GetMyVipArray() 
{ 
    return getThreadSafeAccessInstance<MyVipArrayType, 0>() 
}


// где-то в клиентском коде

auto vipArray = GetMyVipArray();
for( auto i = vipArray->begin(); i != vipArray->end(); I++ )
{
    // ...
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.