MSVC对这段代码很满意,但GCC并不那么热衷

MSVC is happy with this code but GCC isn't so keen

本文关键字:GCC 满意 段代码 代码 MSVC      更新时间:2023-10-16

这段代码在MSVC(19.00.23918(中编译,但GCC不喜欢它,除非我在调用Detach_Internal((时使用这个>成员运算符的访问。

GCC 是否在这里捕获了 MSVC 没有的潜在错误? 作为一般规则,在引用基类中的函数时,始终使用this->是否更好?

注意 GCC 将使用-permissive编译它。

#include <memory>
namespace Events
{
template<typename T>
class EventBase
{
protected:
void Detach_Internal(std::weak_ptr<void> const & p)
{
}
};
template<typename T>
class Event : public EventBase<T>
{
public:
void Detach(std::weak_ptr<void> const & p)
{
Detach_Internal(p);
}
};
}

int main(void)
{
auto event = std::make_unique<Events::Event<void()>>();    
}
33:

30:错误:没有依赖于模板参数的"Detach_Internal"参数,因此必须提供"Detach_Internal"声明 [-fallowive]

GCC 是否在这里捕获了 VS 没有的潜在错误?作为一般规则,在基类中引用函数时始终使用 this-> 是否更好?

海湾合作委员会是正确的。在依赖基类中引用名称时,应添加this->(即EventBase<T>,这取决于模板参数T(。

否则,作为非依赖名称,Detach_Internal将不会在依赖基类EventBase<T>中查找。

要解决此问题,您可以使名称Detach_Internal依赖的,然后在实例化时查找它,此时确切的基类模板专用化是固定的。

this->Detach_Internal(p);
EventBase<T>::Detach_Internal(p);
using EventBase<T>::Detach_Internal;
Detach_Internal(p);