2015-01-20 2 views
1

Следующий код дает мне ошибку компоновщика:Ошибка компоновщика | collect2: ошибка: л.д. возвращается 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

+2

@ πάνταῥεῖ Я предполагаю, что вы даже не поняли вопрос вообще. Это конкретный вопрос, и вы ссылаетесь на общий вопрос. Это похоже на страницу, рассказывающую о том, что такое программирование! Наличие репутации 20K не делает вас правильным. – barej

+0

Как [этот ответ] (http://stackoverflow.com/a/12574403/1413395) из связанного дубликата не объясняет вашу проблему? [Разрабатывайте в своем вопросе пожалуйста] (http://stackoverflow.com/posts/28054426/edit), как на ваш вопрос нет ответа. Вы хотите объявить абстрактную функцию, такую ​​как 'virtual void myfunc() = 0;' в вашем классе 'CBase'? –

ответ

2

Вы не определили (при условии, тело для)

virtual void myfunc(); 

Это правда, что вы не должны определить функции, которые вы не используете, но это не верно для не чисто виртуальные функции. Либо сделайте функцию чистой виртуальной (= 0), либо определите ее.

Кстати,

CMyclass a(); 

не делать то, что вы думаете, что он делает. Это не определяет объект типа CMyClass. Это объявляет функцию, которая возвращает CMyclass. Избавьтесь от круглых скобок.

Смежные вопросы