portability-template-virtual-member-function¶
查找模板类中未实例化的虚成员函数导致跨编译器不兼容的情况。
在实例化模板类时,非虚成员函数只有在使用时才需要实例化。另一方面,虚成员函数的实例化是未指定的,并且取决于编译器的实现。
在以下代码片段中,虚成员函数没有被 GCC 和 Clang 实例化,但它被 MSVC 实例化,因此虽然代码片段被前者编译器接受,但被后者拒绝。
template<typename T>
struct CrossPlatformError {
virtual ~CrossPlatformError() = default;
static void used() {}
virtual void unused() {
T MSVCError = this;
};
};
int main() {
CrossPlatformError<int>::used();
return 0;
}
需要在 Windows 上支持 MSVC 的跨平台项目可能会遇到编译器错误,因为某些虚成员函数被实例化,而这些函数没有被其他平台上的其他编译器实例化。此检查会突出显示这些虚成员函数。