MSVC对此代码感到满意,但GCC并不那么热衷

时间:2017-08-22 16:03:10

标签: c++ templates

此代码在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]

1 个答案:

答案 0 :(得分:8)

  

GCC是否在这里发现了VS不存在的潜在错误?一般来说,最好使用这个 - &gt;什么时候引用基类中的函数?

海湾合作委员会是正确的。在引用依赖基类中的名称时应添加<style> #lam { color: green; } #alef { color: blue; } </style> <p><span id="lam">&#1604;&#8206;&#8205; &#8205;</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);