2011-01-13 3 views
7

Если я перейду с boost :: shared_ptr на std :: shared_ptr в этом фрагменте кода, я получу ошибку компоновщика.Как разрешить конфликт между boost :: shared_ptr и использованием std :: shared_ptr?

#include <iostream> 
#include <sstream> 
#include <iterator> 
#include <cctype> 
#include <cmath> 

#include <string> 
#include <vector> 
#include <stack> 
#include <queue> 
#include <set> 
#include <map> 

#include <functional> 
#include <utility> 
#include <numeric> 

#include <boost/assign.hpp> 
#include <boost/assign/std/vector.hpp> 

#include <boost/algorithm/string.hpp> 

#include <boost/test/included/unit_test.hpp> 
#include <boost/test/included/unit_test_framework.hpp> 
#include <boost/bind.hpp> 

//using namespace std; 
//using namespace boost; 

using std::string; 
using std::ostringstream; 
using namespace boost::assign; 
using namespace boost::unit_test; 

template<typename T> string to_string(T data) { ostringstream ost; ost << data; return ost.str(); } 

class TwoStringMasks { 
public: 
    string shortestCommon(string s1, string s2) { 
     //if(s1.find("*") != 0 || 
     return ""; 
    } 
}; 

class two_string_masks_test { 
public: 
    void test_case_one() { 
     string str = "TOPCODER*"; 
     BOOST_CHECK_EQUAL(str.find("*"), str.length() - 2); 
    } 
}; 

test_suite* init_unit_test_suite(int argc, char* argv[]) { 
    boost::shared_ptr<two_string_masks_test> tester(new two_string_masks_test); 
    framework::master_test_suite().add( 
     BOOST_TEST_CASE(boost::bind(&two_string_masks_test::test_case_one, tester))); 
    return 0; 
} 

Ошибка:

Error 12 error C2784: 'T *boost::get_pointer(T *)' : could not deduce template argument for 'T *' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 10 error C2784: 'T *boost::get_pointer(const std::auto_ptr<_Ty> &)' : could not deduce template argument for 'const std::auto_ptr<_Ty> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 11 error C2784: 'T *boost::get_pointer(const std::auto_ptr<_Ty> &)' : could not deduce template argument for 'const std::auto_ptr<_Ty> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 8 error C2784: 'T *boost::get_pointer(const boost::shared_ptr<X> &)' : could not deduce template argument for 'const boost::shared_ptr<X> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 9 error C2784: 'T *boost::get_pointer(const boost::shared_ptr<X> &)' : could not deduce template argument for 'const boost::shared_ptr<X> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 6 error C2784: 'T *boost::get_pointer(const boost::scoped_ptr<T> &)' : could not deduce template argument for 'const boost::scoped_ptr<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 7 error C2784: 'T *boost::get_pointer(const boost::scoped_ptr<T> &)' : could not deduce template argument for 'const boost::scoped_ptr<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 13 error C2784: 'T *boost::get_pointer(const boost::reference_wrapper<T> &)' : could not deduce template argument for 'const boost::reference_wrapper<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 14 error C2784: 'T *boost::get_pointer(const boost::reference_wrapper<T> &)' : could not deduce template argument for 'const boost::reference_wrapper<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 2 error C2784: 'optional<T>::pointer_type boost::get_pointer(boost::optional<T> &)' : could not deduce template argument for 'boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 3 error C2784: 'optional<T>::pointer_type boost::get_pointer(boost::optional<T> &)' : could not deduce template argument for 'boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 4 error C2784: 'optional<T>::pointer_const_type boost::get_pointer(const boost::optional<T> &)' : could not deduce template argument for 'const boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 5 error C2784: 'optional<T>::pointer_const_type boost::get_pointer(const boost::optional<T> &)' : could not deduce template argument for 'const boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 

Что я сделал не так? Я догадался, что существует конфликт между пространством имен std и расширением пространства имен, но я не знаю, как это исправить? Есть идеи?

Спасибо,
Чан

+2

Это не ошибки компоновщика, а скорее ошибки компилятора. –

ответ

13

Похоже, вам нужно добавить перегруз get_pointer для использования std::shared_ptr с boost :: bind.

namespace boost { 
    template<class T> const T* get_pointer(const std::shared_ptr<T>& ptr) 
    { 
    return ptr.get(); 
    } 

    template<class T> T* get_pointer(std::shared_ptr<T>& ptr) 
    { 
    return ptr.get(); 
    } 
} 

Я бы предположил, что это уже работает, если вы используете вместо этого std::bind. Или используйте tester.get() в bind.

+0

Вау, спасибо за ваше элегантное решение. Является ли std :: bind таким же, как boost :: bind? – Chan

+0

Нет, это не одно и то же, хотя интерфейс и реализация могут быть идентичными. Тем не менее, 'std :: bind' концептуально получен из версии boost. Возможно, это немного изменилось в процессе стандартизации. – ltjax

6

подталкивания и TR1 общие указатели являются отдельными реализациями и не совместимы - выбрать один или другой, и использовать его исключительно.

+0

спасибо, не могли бы вы показать мне, как? Я хочу использовать std :: shared_ptr в этом случае, но я не мог. – Chan

+0

Сначала вы должны, вероятно, указать, где вы используете std :: tr1 :: shared_ptr - для меня ничего не выскочит, но поскольку я не уверен, какой столбец в этом сообщении об ошибке должен быть номером строки, это сложно чтобы соответствовать ошибкам – bdonlan

+0

Он сказал, что если он преобразует из boost в tr1, то, предположительно, внутри связки. Но, как я уже сказал, он должен использовать tr1 :: bind. Мой собственный опыт заключается в том, что усиление гораздо лучше написано, чем tr1, поэтому придерживайтесь его. – CashCow

3

boost :: bind не знает, что делать с tr1 :: shared_ptr, он умеет обрабатывать boost :: shared_ptr.

Вы можете попробовать tr1 :: bind, который, вероятно, работает с tr1 :: shared_ptr.

Единственная проблема в том, будет ли это работать в BOOST_TEST_CASE. Если он просто ожидает «runnable», то функция tr1 :: такая же, как «runnable», как boost.

+0

исправил его! Большое спасибо. Являются ли tr1 :: bind & boost :: bind одинаковыми? (просто другое пространство имен)? – Chan

+0

Нет, они не совпадают, но оба они производят так называемый «runnable», который является термином для чего-то, что может действовать как функция, и в этом случае BOOST_TEST_CASE не заботится о реализации или источнике, который создал runnable (т.е. он не должен исходить от повышения). – CashCow

1

Вы заметили, что вы явно не включаете заголовок < (а не < boost/shared_ptr.hpp> в этом отношении)?

Если вы предоставили дополнительную информацию, было бы легче помочь.

  1. Какой у вас компилятор?
  2. Ожидаете ли вы использовать tr1 из своего компилятора из boost?
  3. Вы хотите получить доступ к shared_ptr как std :: tr1 :: shared_ptr или просто std :: shared_ptr?
+0

спасибо за вашу заботу. Компилятор: VC++ 2010, я хочу std :: shared_ptr, так как это C++ 0x std, а не std :: tr1 :: shared_ptr. – Chan

Смежные вопросы