0

다음 코드를 고려하십시오. A는 추상적이고 일반적인 클래스입니다. B는 모두 그것을 구현하고 전문화합니다. 이 코드는 내게는 사소한 것처럼 보이지만, 어떤 이유로 든 이상한 링커 오류로 끝납니다.가상 멤버가있는 템플릿 클래스 : 링커 오류

template<typename T> 
class A { 
    public: 
     virtual void f(); 
}; 

class B : public A<int> { 
    public: 
     void f() {}; 
}; 

int main(int argc, char** argv) { 
    auto b = new B(); 
    return 0; 
} 

GCC 출력 :

/tmp/ccXG2Z8A.o:(.rodata._ZTV1AIiE[_ZTV1AIiE]+0x10): undefined reference to `A<int>::foo()' 
collect2: error: ld returned 1 exit status 

그 소리 출력 :

/tmp/l2-2a09ab.o: In function `main': 
l2.cpp:(.text+0x35): undefined reference to `operator new(unsigned long)' 
/tmp/l2-2a09ab.o:(.rodata._ZTI1AIiE[_ZTI1AIiE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' 
/tmp/l2-2a09ab.o:(.rodata._ZTI1B[_ZTI1B]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
/tmp/l2-2a09ab.o:(.rodata._ZTV1AIiE[_ZTV1AIiE]+0x10): undefined reference to `A<int>::foo()' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
+1

우선 A는 추상 클래스가 아닙니다. 당신은해야한다 : virtual void foo() = 0; 그것을 순수 가상 기능으로 만들기 위해 – Asesh

+0

이것은 고마워. 답변을 제출하면 받아 들일 것입니다. –

+1

'A :: f()'를 구현하거나 순수 가상으로 만들어야합니다. 가상 메소드가 없으면 링커는 'A'의 가상 메소드 테이블을 생성 할 수 없습니다. 그래서이 메시지가 나타납니다. – Franck

답변

1

하기 위해, 당신의 기능을 대신 ffoo라고 가정합니다.

문제는 해당 메서드를 선언하지 않았기 때문에 클래스 A이 추상이 아니라는 것입니다. 이 방법으로 그렇게 할 것입니다 :

virtual void foo() = 0; 

그러나 링커는 방법은 추상적이며, 따라서이없는 함수 본문을 찾고있는 것을 알고하지 않도록 당신은 = 0을 잊어 버렸습니다.

1

A는 추상 클래스가 아닙니다. 당신이해야 할 :

virtual void f() = 0; 

는 GCC 출력에서 ​​순수 가상 함수