«Полученный указатель на член» на «базовый указатель на член».C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 «Полученный указатель на член» на «базовый указатель на член».

Сообщение Anonymous »

Чтобы поддержать магию времени компиляции, я хотел бы использовать указатели для таких участников, как: < /p>

Код: Выделить всё

struct BaseT
{
};

struct DerivedT: public BaseT
{
};

struct TestT
{
DerivedT testMem;

typedef BaseT (TestT::* TestTMemPtr);

constexpr TestT() = default;

static constexpr TestTMemPtr testMemOffset()
{
return &TestT::testMem;
}
};

int main()
{
constexpr TestT test;
}
< /code>
Я не могу вернуть члена по указателю в качестве члена указателя к базе, я получаю это с Clang: < /p>
cannot initialize return object of type 'TestT::TestTMemPtr' (aka 'BaseT (TestT::*)') with an rvalue of type 'DerivedT TestT::*'
< /code>
Я проверил его с помощью GCC: < /p>
error: invalid conversion from 'DerivedT TestT::*' to 'TestT::TestTMemPtr' {aka 'BaseT TestT::*'}
< /code>
Это нормальное поведение? Я думал, что всегда могу использовать полученный указатель в качестве базового указателя. 
[b] Обновление [/b]:
ok, исходный пример не был лучшим, я думаю, что это более выразительно, поэтому defivedt* может использоваться в качестве основания*, но defivedt testt ::* не может быть использован в качестве базисового тестирования::::*code>: presttt step ::*
не может быть использован.struct BaseT
{
};

struct DerivedT: public BaseT
{
};

struct TestT
{
DerivedT m_test;
};

using BaseTMemPtr = BaseT TestT::*;

int main()
{
TestT test;
BaseT* simplePtr = &test.m_test; //It is DerivedT*, but can be used as BaseT*
BaseT (TestT::*memPtr) = &TestT::m_test; //Error, BaseT TestT::* cannot be used as DerivedT TestT::*
BaseTMemPtr memPtr2 = &TestT::m_test; //Error, just the same
}


Подробнее здесь: https://stackoverflow.com/questions/695 ... mber-error
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»