2013-11-13 3 views
4
#include <boost/any.hpp> 
#include <list> 
#include <string> 
#include <vector> 

struct _time_t { 
    int month; 
    int year; 
}; 


int main() 
{ 
    std::string str = "hahastr"; 
    _time_t t; 
    std::vector<boost::any> objVec; 
    objVec.push_back(1); 
    char* pstr = "haha"; 
    //boost::any charArr = "haha"; not compile 
    //objVec.push_back("haha"); not compile 
    objVec.push_back(pstr); 
    objVec.push_back(str); 
    objVec.push_back(t); 
    return 0; 
}; 

прокомментированные строки кода не компилируются, почему? Я думаю, что строковый литерал может действовать как char * в большинстве обстоятельств, это связанное значение r и l-rvalue?Почему boost :: any не содержит строковый литерал?

сообщение об ошибке: test_boost_any.cc

D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : wa 
rning C4530: C++ exception handler used, but unwind semantics are not enabled. S 
pecify /EHsc 
e:\projects\framework\boost_1_53_0\boost/any.hpp(122) : error C2536: 'boost::any 
::holder<ValueType>::boost::any::holder<ValueType>::held' : cannot specify expli 
cit initializer for arrays 
     with 
     [ 
      ValueType=const char [5] 
     ] 
     e:\projects\framework\boost_1_53_0\boost/any.hpp(139) : see declaration 
of 'boost::any::holder<ValueType>::held' 
     with 
     [ 
      ValueType=const char [5] 
     ] 
     e:\projects\framework\boost_1_53_0\boost/any.hpp(120) : while compiling 
class template member function 'boost::any::holder<ValueType>::holder(ValueType 
(&))' 
     with 
     [ 
      ValueType=const char [5] 
     ] 
     e:\projects\framework\boost_1_53_0\boost/any.hpp(47) : see reference to 
function template instantiation 'boost::any::holder<ValueType>::holder(ValueType 
(&))' being compiled 
     with 
     [ 
      ValueType=const char [5] 
     ] 
     e:\projects\framework\boost_1_53_0\boost/any.hpp(46) : see reference to 
class template instantiation 'boost::any::holder<ValueType>' being compiled 
     with 
     [ 
      ValueType=const char [5] 
     ] 
     test_boost_any.cc(19) : see reference to function template instantiation 
'boost::any::any<const char[5]>(ValueType (&))' being compiled 
     with 
     [ 
      ValueType=const char [5] 
     ] 
+2

Что компилятор вам говорит? – BoBTFish

ответ

4

строкового литерала не является указателем, это array of N const char, в вашем случае, поскольку boost::any конструктор получают T (который выводится на char[5], не const char*, массив преобразование-to-pointer не может работать здесь), но вы не можете инициализировать массив другим массивом в initializer-list.

1

Компилятор говорит вам, что он не может принять массив, например, VS2010 скажет вам:

1>D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(122): error C2536: 'boost::any::holder<ValueType>::boost::any::holder<ValueType>::held' : cannot specify explicit initializer for arrays 
1>   with 
1>   [ 
1>    ValueType=const char [5] 
1>   ] 
1>   D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(139) : see declaration of 'boost::any::holder<ValueType>::held' 
1>   with 
1>   [ 
1>    ValueType=const char [5] 
1>   ] 
1>   D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(120) : while compiling class template member function 'boost::any::holder<ValueType>::holder(ValueType (&))' 
1>   with 
1>   [ 
1>    ValueType=const char [5] 
1>   ] 
1>   D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(46) : see reference to class template instantiation 'boost::any::holder<ValueType>' being compiled 
1>   with 
1>   [ 
1>    ValueType=const char [5] 
1>   ] 
1>   toto.cpp(20) : see reference to function template instantiation 'boost::any::any<const char[5]>(ValueType (&))' being compiled 
1>   with 
1>   [ 
1>    ValueType=const char [5] 
1>   ] 

Тип «ха-ха», не const char* но const char[5]. Если вы приводите строку в char* это будет компилировать:

boost::any charArr = static_cast<const char*>("haha"); // will compile 

В качестве альтернативы, вы можете просто хранить std::string, например. Я подозреваю, что это потому, что массив не может быть сохранен как указатель. Вы также можете использовать boost::array или std::array (если у вас есть).

Here - ссылка на обсуждение, чтобы добавить поддержку массива в Boost.

+0

Даже 'const char *' будет работать (и, вероятно, будет лучше) – 6502

+0

Вы правы ... – BlueTrin

2

Boost.any значения должны быть действительными для присвоения (требование ValueType). Строковый литерал, однако, массив и массивы не могут быть назначены в C++.

Вы можете просто нарисовать литерал до const char *, если вам это нужно.

2

Самый простой способ решения crufty семантики массива в C здесь

boost::any charArr = +"haha"; 

Обратите внимание на использование + неявно распадаться на массив символов до const char*

Другие объяснили проблему со значением массива семантика

0

Простая версия этой проблемы:

template <typename T> 
class Array 
{ 
    public: 
     Array(T value) : value_(value) {} 
    private: 
     T value_; 
}; 

int main() 
{ 
    int a[5] = {1,2,3,4,5}; 
    Array<int[5]> arr = a; 
    return 0; 
} 
Смежные вопросы