【发布时间】:2016-08-26 05:33:36
【问题描述】:
关于为this question 提供解决方案,我尝试简化答案中提供的代码以使用RTTI 和typeid() 函数来检索类名:
#include <iostream>
#include <string>
#include <typeinfo>
struct IDriver {
// Public virtual API:
virtual void func1() = 0;
// ...
virtual ~IDriver() {}
};
class SpecificDriver;
template<typename Derived>
class Driver : public IDriver {
public:
Driver() {
std::cout << typeid(*this).name() << std::endl;
std::cout << typeid(Derived).name() << std::endl;
}
virtual ~Driver() {}
};
class SpecificDriver : public Driver<SpecificDriver> {
public:
// Public virtual API:
virtual void func1();
virtual ~SpecificDriver() {}
};
int main() {
SpecificDriver sd;
}
Using this code 导致链接器错误:
/tmp/ccXnTrfe.o: In function `main':
main.cpp:(.text.startup+0x4f): undefined reference to `typeinfo for SpecificDriver'
为什么这会导致 typeinfo 的未定义引用错误,而不是缺少 func1() 定义(顺便说一句,它甚至没有使用)?
有趣的是,当我删除所有 virtual 的东西时,它工作得很好:
#include <iostream>
#include <string>
#include <typeinfo>
template<typename Derived>
class Driver {
public:
Driver() {
std::cout << typeid(*this).name() << std::endl;
std::cout << typeid(Derived).name() << std::endl;
}
};
class SpecificDriver : public Driver<SpecificDriver> {
};
int main() {
SpecificDriver sd;
}
输出:
6DriverI14SpecificDriverE
14SpecificDriver
那么这真的和vtable generation有关吗?
【问题讨论】:
-
您为什么使用
virtual会员? CRTP 用于静态多态性。 -
@TemplateRex 我很清楚。这是因为引入了公共 API。这是否与我的错误有关?
-
@TemplateRex 有趣的是,它是seems to matter。
-
如果这是由其他人发布的,OP 将作为“未定义引用”线程的副本关闭
-
@M.M 请把我带到涉及这种特殊情况的相应部分。
标签: c++ undefined-reference crtp typeinfo