Некоторые ошибки в коде:
- Прежде всего, вы не можете использовать TypeName как пользовательское имя, это C++ ключевое слово.
Во-вторых, вы не можете использовать
O* varb = new C();
cout << O->typename();
поскольку вы пытаетесь разыменовывать имя класса, и что не имеет никакого смысла. Вы, вероятно, имели в виду varb-> typename() в любом случае.
К использованию типа.если вы пытаетесь использовать TypeId вернуть динамически имя класса указатель со ссылкой (выполнения), вы должны использовать что-то вроде
#include <iostream>
#include <typeinfo>
using namespace std;
class O {
public:
virtual void vfunction() // Just one virtual function in the base to make the derived polymorphic
{
cout << "hello";
}
};
class C : public O
{
public:
C() {};
};
int main()
{
// your code goes here
O* varb = new C(); // Declare an O* pointer to C
cout << typeid(*varb).name(); // This will print out "C", runtime info
cout << typeid(varb).name(); // This will print out "O*"
return 0;
}
http://ideone.com/K2RGd5
И имейте в виду, что потребности класса быть полиморфным (то есть , чтобы наследовать от базового класса с виртуальными функциями), чтобы typeid возвращал класс выполнения, который указывает на разыменование указателя.
Некоторые больше информации здесь: https://stackoverflow.com/a/11484105/1938163
Примечание: в приведенном выше коде, если вы используете GCC, вы можете увидеть различные имена классов, чем оригинал, который вы использовали .. это специально определено НКУ благодаря name mangling, и если вы хотите реальные имена код, чтобы показать, вы должны использовать что-то вроде
#include <iostream>
#include <typeinfo>
#include <cxxabi.h> // Needed to demangle in gcc
using namespace std;
class O {
public:
virtual void vfunction()
{
cout << "hello";
}
};
class C : public O
{
public:
C() {};
};
int main() {
// your code goes here
O* varb = new C();
int status;
// Demangle symbols
cout << __cxxabiv1::__cxa_demangle(typeid(*varb).name(), nullptr, 0, &status); << endl;
cout << __cxxabiv1::__cxa_demangle(typeid(varb).name(), nullptr, 0, &status);
return 0;
}
'typename' - это ключевое слово. –
Скомпилирует? –