다음 코드를 고려하십시오. 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)
우선 A는 추상 클래스가 아닙니다. 당신은해야한다 : virtual void foo() = 0; 그것을 순수 가상 기능으로 만들기 위해 – Asesh
이것은 고마워. 답변을 제출하면 받아 들일 것입니다. –
'A :: f()'를 구현하거나 순수 가상으로 만들어야합니다. 가상 메소드가 없으면 링커는 'A'의 가상 메소드 테이블을 생성 할 수 없습니다. 그래서이 메시지가 나타납니다. – Franck