System :: Boolean и bool не сопоставимы в C ++ / CLI? - PullRequest
4 голосов
/ 14 февраля 2012

Я использую Visual C ++ 2008 SP1 Pro. Следующий фрагмент кода не скомпилируется:

int main(void) {
    System::Boolean^ foobar = true;
    if (foobar == true) {
        System::Console::Write("yeah!");
    }
}

Выдает следующие ошибки:

1>.\main.cpp(3) : warning C4805: '==' : unsafe mix of type 'System::Boolean ^' and type 'bool' in operation
1>.\main.cpp(3) : error C2446: '==' : no conversion from 'int' to 'System::Boolean ^'
1>        No user-defined-conversion operator available, or
1>        No standard conversion exists from the boxed form of the arithmetic type to the target type
1>.\main.cpp(3) : error C2040: '==' : 'System::Boolean ^' differs in levels of indirection from 'int'

Следующий код прекрасно компилируется:

int main(void) {
    System::Boolean^ foobar = true;
    if (foobar->Equals(true)) {
        System::Console::Write("yeah!");
    }
}

Я что-то не так делаю? Есть ли лучший способ сравнить System :: Boolean с bool в C ++ / CLI, чем с помощью -> Equals () и -> CompareTo ()?

Ответы [ 2 ]

6 голосов
/ 14 февраля 2012

System::Boolean^ является ссылкой на (в штучной упаковке) логическое значение. Вместо этого используйте System::Boolean.

0 голосов
/ 14 февраля 2012

Вместо:

if (foobar == true)

используйте:

if (foobar)

Или используйте обычный bool, если это для простой логики:

int main(void) {
    bool foobar = true;
    if (foobar) {
        System::Console::Write("yeah!");
    }
}

Проблема в VSявляется то, что bool является int, поэтому сравнение объектов с целыми числами не имеет смысла.

...