2015-02-16 2 views
2

В проекте CLI у меня есть функция, которая принимает объект^и должна знать, какой тип хранится в объекте. Мой код хорошо работает для классов, но как использовать его для структур?Как использовать typeid() для structs

using namespace System::Drawing; 

void AddObject(Object^% o_Object) 
{ 
    Type^ i_Type = o_Object->GetType(); 

    if (i_Type == String::typeid) // OK 
    { 
     ... do something 
     return; 
    } 

    if (i_Type == Rectangle::typeid) // ERROR 
    { 
     ... do something 
     return; 
    } 
} 

Компилятор говорит: ошибка C3083: «Прямоугольник»: символ слева в «::» должен быть типом.

Тогда я попробовал:

if (i_Type == typeid(Rectangle)) 
{ 
    ... do someting 
    return; 
} 

Теперь она говорит мне: ошибка C2446: '==': не преобразование из 'сопзЬ type_info' в 'System :: Type^

Тогда я пробовал:

if (typeid(o_Object) == typeid(Rectangle)) 
{ 
    ... do someting 
    return; 
} 

Теперь он говорит мне: ошибка C3185: 'TypeId': используется на управляемом типа 'System :: Object ^', используйте 'System :: Object^:: TypeId' вместо

Тогда я попробовал:

if (o_Object::typeid == typeid(Rectangle)) 
{ 
    ... do someting 
    return; 
} 

И он говорит мне: ошибка C2653: 'o_Object': не класс или пространство имен имя

Что я могу сделать?

+0

Когда я использую VS2013 и весь ваш первый блок кода (с комментариями '... do something'), я не получаю ошибок. Убедитесь, что вы ссылаетесь на System.Drawing.dll и попробуйте использовать полное имя ('System :: Drawing :: Rectangle :: typeid') в строке if. –

+0

Я полагаю, вы не #include в своем проекте. Я уже нашел причину. Смотри ниже. – Elmue

+0

Нет, я этого не делал. Я ожидал, что у вас есть какое-то столкновение с именами, но не был уверен, что это будет. –

ответ

0

я нашел причину:

компилятор не принимает System :: Рисование :: Rectangle APTHOUGH Вы пишете:

using namespace System::Drawing; 

в верхней части. Компилятор принимает функцию

WINGDIAPI BOOL WINAPI Rectangle(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom); 

вместо того, что определено в WinGdi.h.

Я должен добавить:

#using <system.drawing.dll> 

в верхних

и Addtionally пишет:

if (i_Type == System::Drawing::Rectangle::typeid) 
{ 
    ... do someting 
    return; 
} 

для разрешения неоднозначности.

Это не имеет никакого отношения, если typeid взято из класса или структуры, как я думал изначально.

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