以下代码给出了链接器错误:
#include <iostream>
using namespace std;
class CBase
{
public:
virtual void myfunc();
CBase()
{
// constructor
}
};
class CMyclass: public CBase
{
public:
CMyclass(): CBase()
{
// constructor
}
void myfunc()
{
}
};
auto create_class()-> CMyclass
{
return CMyclass();
}
int main()
{
// auto sys_conrollable = create_class();
CMyclass a();
return 0;
}
运行编译器很好:
g++ -g -Wfatal-errors -std=c++11 main.cpp -c -o main.o
链接器:
g++ -g -Wfatal-errors -std=c++11 main.o -o run
给出了这个错误:
main.o :(。rodata._ZTI8CMyclass [_ZTI8CMyclass] + 0x10):对于CBase&#39;的`typeinfo的未定义引用 collect2:错误:ld返回1退出状态
删除create_class
函数可修复错误。在原始代码中,create_class
将是调用模板类的模板。所以请不要告诉我删除auto!
答案 0 :(得分:2)
您还没有定义(提供正文)
virtual void myfunc();
确实,您不必定义您不会使用的功能,但对于非纯虚拟功能则不然。使函数纯虚拟(= 0
)或提供定义。
顺便提及,
CMyclass a();
没有做你认为的事情。这不会定义CMyClass
类型的对象。这声明了一个返回CMyclass
的函数。摆脱括号。