2015-01-20 218 views
1

下面的代码给我链接错误:链接器错误| collect2:错误:LD返回1退出状态

#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): undefined reference to `typeinfo for CBase' collect2: error: ld returned 1 exit status

删除create_class功能修复了错误。在原始代码中,create_class将是调用模板类的模板。所以请不要告诉我去除汽车!

+0

@πάνταῥεῖ无关链接 – barej 2015-01-20 20:54:07

+2

@πάνταῥεῖ我假设你甚至不明白的问题都没有。它是一个具体的问题,你链接到一个普遍的问题。它就像喜欢一个页面谈论什么是编程!拥有20K的声誉并不会让你变得正确。 – barej 2015-01-20 21:03:30

+0

如何从链接副本[此答案](http://stackoverflow.com/a/12574403/1413395)不解释您的问题? [请在你的问题中详细说明](http://stackoverflow.com/posts/28054426/edit)你的情况在这里没有得到回答。你想在'CBase'类中声明一个像'virtual void myfunc()= 0;'这样的抽象函数吗? – 2015-01-20 21:27:19

回答

2

您还没有定义(提供身体)

virtual void myfunc(); 

这是事实,你不必定义你不使用的功能,但事实并非如此非纯虚功能。可以使该功能为纯虚拟(= 0)或提供定义。

顺便说一句,

CMyclass a(); 

没有做什么,你认为它。这没有定义类型为CMyClass的对象。这声明了一个返回CMyclass的函数。摆脱括号。

相关问题