error C2440: 'reinterpret_cast' : cannot convert from 'class A::tagprop A::*' to 'class CNamedTreePropertyBase *'
There is no context in which this conversion is possible
Какие могут быть причины не преобразовывать указатель на объект класса A в указатель на объект класса B? Это стандартное поведение?
Re: Как привести к типу?
От:
Аноним
Дата:
03.02.08 09:20
Оценка:
Ты бы привел пример без макросов что-ли...
Re[2]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:
class Base
{
Base(Base *) {}
};
struct A
{
Base base;
struct _tag_x : public Base
{
_tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
} x;
};
Компилятор выдает ошибку:
error C2440: 'reinterpret_cast' : cannot convert from 'class Base A::*' to 'class Base *' There is no context in which this conversion is possible
"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a
specific object
_tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
Re[4]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 10:14
Оценка:
Здравствуйте, Programador, Вы писали:
P>http://www.comeaucomputing.com/tryitout/
P>"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a P> specific object P> _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
Как — нибудь можно это обойти?
Re[5]: Примерно то же, но без макросов. Как привести к типу?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Programador, Вы писали:
P>>http://www.comeaucomputing.com/tryitout/
P>>"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a P>> specific object P>> _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
А>Как — нибудь можно это обойти?
Я не очень понимаю какого эффекта нужно достичь Скажем есть еще
struct B
{
Base base;
.........
};
Что от них нужно?
Re[5]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 10:27
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Как — нибудь можно это обойти?
Ну, например так:
class Base
{
public:
Base(Base *) {}
};
struct A
{
Base base;
struct _tag_x : public Base
{
_tag_x(Base *pBase) : Base(pBase) {}
} x;
A():x(&base)
{
}
};
Проблема твоя совсем не связана с преобразованиями типов...
Чтобы было понятно в чем проблема, попробуй представить, что должен делать компайлер,
если ты захочешь просто объявить переменную типа A::_tag_x
Поскольку это самый нормальный тип, только объявленный в контексте типа А,
то ты можешь делать так:
void foo()
{
_tag_x x; // opsss...
}
Re[5]: Примерно то же, но без макросов. Как привести к типу?
Здравствуйте, <Аноним>, Вы писали:
А>Как — нибудь можно это обойти?
Если только ошибку компиляции то легко
struct Base
{
Base(Base *) {}
};
struct A
{
staticBase base;
struct _tag_x : public Base
{
_tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
} x;
};
Только что дальше?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[6]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 10:49
Оценка:
Здравствуйте, Programador, Вы писали:
P>Я не очень понимаю какого эффекта нужно достичь Скажем есть еще
Нужно обьявить серию вложенных классов(структур) со свойствами в виде структур, чтобы в каждом обьекте структуры лежал указатель на обьект другой структуры. То есть объявить и определить дерево в одном файле, так чтобы не возникало ошибок линкера о повторном определении объекта.
Re[6]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 11:02
Оценка:
Здравствуйте, Baburin S.S., Вы писали:
static не подойдет, если в классе B будет переменная типа std::string, или что нибудь в этом роде, то будут утечки памяти.
Re[7]: Примерно то же, но без макросов. Как привести к типу?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Programador, Вы писали:
P>>Я не очень понимаю какого эффекта нужно достичь Скажем есть еще
А>Нужно обьявить серию вложенных классов(структур) со свойствами в виде структур, чтобы в каждом обьекте структуры лежал указатель на обьект другой структуры. То есть объявить и определить дерево в одном файле, так чтобы не возникало ошибок линкера о повторном определении объекта.
связать их указателями на базовый класс и в него поместиь GetName и т.п. как виртуальные?
Re[8]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 11:47
Оценка:
Здравствуйте, Programador, Вы писали:
P>связать их указателями на базовый класс и в него поместиь GetName и т.п. как виртуальные?
Да, этого и хотелось. Этого можно достичь без проблем, если использовать два макроса —
один типа DECLARE... в *.h — файле, а другой типа IMPLEMENT... — в *.cpp файле. В макросах, соответственно обьявляются и определяются объекты. Но может быть можно обойтись одним макросом в *.h файле? Пока что не знаю.
Re[3]: Примерно то же, но без макросов. Как привести к типу?
Аноним 834 пишет: > *error C2440: 'reinterpret_cast' : cannot convert from 'class Base A::*' > to 'class Base *' There is no context in which this conversion is possible*
И правильно делает. Вложенный класс ничего об охватывающем не знает.
Это вам не Java. > > Как тут можно сделать приведение типа указателя?
Если тебе нужен указатель на мембер, нужно его ПРОСТО ВЕРНУТЬ из какой-то
мембер-функции.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Примерно то же, но без макросов. Как привести к типу?
От:
Аноним
Дата:
03.02.08 11:55
Оценка:
Здравствуйте, MasterZiv, Вы писали:
MZ>Если тебе нужен указатель на мембер, нужно его ПРОСТО ВЕРНУТЬ из какой-то MZ>мембер-функции.
А через шаблоны можно такое реализовать? Так, чтобы можно было записать одним макросом?
А>Сообщение компилятора:
А>error C2440: 'reinterpret_cast' : cannot convert from 'class A::tagprop A::*' to 'class CNamedTreePropertyBase *' А> There is no context in which this conversion is possible
А>Какие могут быть причины не преобразовывать указатель на объект класса A в указатель на объект класса B? Это стандартное поведение?
А ты почитай внимательно сообщение компилятора, тебе не кажется, странной выделенная конструкция? То, что ты пытаешься сделать, НЕ является приведением указателя одного типа к узазателю другого типа. Ты пытаешься привести указазатель-на-член-класса к указателю на объект класса. Указатели на члены классов — это совершенно особый тип указателей. Они не могут быть использованы как самостоятельные указатели, а только в применении к каким-то экземплярам классов. И заказанное тобой преобразование не под силу даже reinterpret_cast.
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
А>>Сообщение компилятора:
А>>error C2440: 'reinterpret_cast' : cannot convert from 'class A::tagprop A::*' to 'class CNamedTreePropertyBase *' А>> There is no context in which this conversion is possible
А>>Какие могут быть причины не преобразовывать указатель на объект класса A в указатель на объект класса B? Это стандартное поведение?
R>А ты почитай внимательно сообщение компилятора, тебе не кажется, странной выделенная конструкция? То, что ты пытаешься сделать, НЕ является приведением указателя одного типа к узазателю другого типа. Ты пытаешься привести указазатель-на-член-класса к указателю на объект класса. Указатели на члены классов — это совершенно особый тип указателей. Они не могут быть использованы как самостоятельные указатели, а только в применении к каким-то экземплярам классов. И заказанное тобой преобразование не под силу даже reinterpret_cast.
Другими словами, вот иллюстрация твоей ошибки в максимально упрощенном варианте:
struct A
{
int x;
};
int* y = reinterpret_cast<int*>(&A::x);
error C2440: 'reinterpret_cast' : cannot convert from 'int A::* ' to 'int *'
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Как привести к типу?
От:
Аноним
Дата:
03.02.08 12:23
Оценка:
Здравствуйте, rg45, Вы писали:
R>А ты почитай внимательно сообщение компилятора, тебе не кажется, странной выделенная конструкция? То, что ты пытаешься сделать, НЕ является приведением указателя одного типа к узазателю другого типа. Ты пытаешься привести указазатель-на-член-класса к указателю на объект класса. Указатели на члены классов — это совершенно особый тип указателей. Они не могут быть использованы как самостоятельные указатели, а только в применении к каким-то экземплярам классов. И заказанное тобой преобразование не под силу даже reinterpret_cast.
Мне кажется, что такое разделение усложняет кодирование. Но понятно, что спорить бесполезно.