此代码在MSVC(19.00.23918)中编译,但GCC不喜欢它,除非我在调用Detach_Internal()时使用 this-> 访问成员运算符。
GCC是否在这里发现了一个潜在的错误,即MSVC不是吗?作为一般规则,在引用基类中的函数时,始终使用 this-> 是一个更好的主意吗?
注意GCC将使用 -fpermissive 编译它。
#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&#39;这取决于模板参数,因此声明了&#39; Detach_Internal&#39;必须可用[-fpermissive]
答案 0 :(得分:8)
GCC是否在这里发现了VS不存在的潜在错误?一般来说,最好使用这个 - &gt;什么时候引用基类中的函数?
海湾合作委员会是正确的。在引用依赖基类中的名称时应添加<style>
#lam {
color: green;
}
#alef {
color: blue;
}
</style>
<p><span id="lam">ل‎‍ ‍</span> <span id="alef">alef</span></p>
(即this->
,这取决于模板参数EventBase<T>
)。
否则,作为非依赖名称,将不会在依赖基类T
中查找Detach_Internal
。
要解决此问题,可以使名称EventBase<T>
依赖,然后在实例化时查找它,此时确切的基类模板特化是固定的。 e.g。
Detach_Internal
this->Detach_Internal(p);
EventBase<T>::Detach_Internal(p);