Ошибка C2451 при использовании boost :: any - PullRequest
2 голосов
/ 05 апреля 2011
class A {
public:
    void f()
    {
        cout << "A()" << endl;
    }
};

class B {
public:
    void f()
    {
        cout << "B()" << endl;
    }
};

class C {
public:
    void f()
    {
        cout << "C()" << endl;
    }
};

void print(boost::any& a)
{
    if(A* pA = boost::any_cast<A>(&a))
    {
        pA->f();
    }
    else if(B* pB = boost::any_cast<B>(&a))
    {
        pB->f();
    }
    else if(C* pC = boost::any_cast<C>(&a))
    {
        pC->f();
    }
    else if(string s = boost::any_cast<string>(a))
    {
        cout << s << endl;
    }
    else if(int i = boost::any_cast<int>(a))
    {
        cout << i << endl;
    }
}

int main() 
{
    vector<boost::any> v;
    v.push_back(A());
    v.push_back(B());
    v.push_back(C());
    v.push_back(string("Hello boy"));
    v.push_back(24);

    for_each(v.begin(), v.end(), print);
}

Я получаю эту ошибку в print () при тестировании строки с помощью Visual Studio 2010:

 error C2451: conditional expression of type 'std::string' is illegal
          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011
else if(string s = boost::any_cast<string>(a))

Эта строка вызывает у вас проблемы. Строка s не является указателем, это переменная стека. Вы не можете сделать проверку на ноль.

Причина, по которой вы можете проверить целое число ниже, заключается в том, что целые числа неявно отображаются в bool.
0 -> ЛОЖЬ
1 -> ИСТИНА

0 голосов
/ 05 апреля 2011

Вы не должны использовать any_cast для ссылки здесь, потому что она выдает исключение bad_any_cast, если тип не правильный.Используйте указатель в последних двух случаях, как вы сделали с первыми тремя:

else if(string* s = boost::any_cast<string*>(&a))
{
    cout << *s << endl;
}
else if(int* i = boost::any_cast<int*>(&a))
{
    cout << *i << endl;
}
...