Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是GCC中的错误吗?_C++_Templates_Visual C++_Gcc_Name Lookup - Fatal编程技术网

C++ 这是GCC中的错误吗?

C++ 这是GCC中的错误吗?,c++,templates,visual-c++,gcc,name-lookup,C++,Templates,Visual C++,Gcc,Name Lookup,编辑:这不是一个错误,只是我不知道(MSVC“帮助”解决没有错误) 不久前,我编写了一个函子实现,以及一个使用它的简单“事件”包装器。它在MSVC下可以很好地编译,但是GCC给出了一个关于基类中未声明的成员变量的错误,subscribers;将subscribers更改为this->subscribers可以解决问题(!)。这似乎只发生在奇怪的重复模板模式和部分模板专门化的情况下 简化源代码(很抱歉使用了令人费解的模板…): 这是MSVC中的一个错误。依赖基类的名称必须是“thisambigu

编辑:这不是一个错误,只是我不知道(MSVC“帮助”解决没有错误)


不久前,我编写了一个函子实现,以及一个使用它的简单“事件”包装器。它在MSVC下可以很好地编译,但是GCC给出了一个关于基类中未声明的成员变量的错误,
subscribers
;将
subscribers
更改为
this->subscribers
可以解决问题(!)。这似乎只发生在奇怪的重复模板模式和部分模板专门化的情况下

简化源代码(很抱歉使用了令人费解的模板…):


这是MSVC中的一个错误。依赖基类的名称必须是“thisambiguated”

原因是非限定查找依赖名称。在第一阶段中,基类还未知,编译器无法解析名称。MSVC不实现两阶段名称查找,并将查找延迟到第二阶段

完全专业化

template<>
struct Event<void, void> : public EventBase<Event<> >
{
        void trigger() const
        {
                // No error here even without `this`, for some reason!
                auto it = subscribers.cbegin();
        }
};
模板
结构事件:公共事件库
{
无效触发器()常量
{
//由于某种原因,即使没有“this”,这里也没有错误!
auto it=subscribers.cbegin();
}
};
不会遇到这个问题,因为类及其基都是常规类,而不是类模板,并且没有模板依赖关系


< >将C++代码从MSVC移植到GCC/CLAN、依赖名称查找消歧和(即调用成员函数模板使用<代码>:模板> <代码> >模板>代码> >或代码>模板> <代码>语法是您必须处理的两个微妙之处(另一个)。对于所有符合标准的言辞,出于向后兼容性的原因,这可能永远不会被修复。

您能进一步解释一下吗?为什么在最后一个案例中不是错误?(双关语)卡梅隆:最后一个案例不是模板,它是一个完整的专业化案例。关于编译的所有内容都是在编译时知道的。@卡梅伦C++的FAQ有一个原因,就是为什么在这个例子中需要代码>这个-> /COD>。它在MSVC上工作,因为它没有实现模板的两阶段名称查找。啊哈,谢谢大家。我太傻了,因为我对编译器错误妄下结论。还有一个我从未知道的C++的角落:-卡梅伦,我也被这个咬过了!我也遇到过这种情况。根据经验,如果涉及模板,请始终信任gcc而不是msvc(我发现gcc在99.9%的情况下是正确的)。@JesseGood甚至还有来自另一个msvc难民的副本。显然,gcc在3.4版本的某个地方修复了它,在这个过程中打破了一些旧代码。但是,谁说厂商需要bug兼容性作为卖点呢?
main.cpp: In member function ‘void Event<TArg1, TArg2>::trigger(TArg1, TArg2) const’:
main.cpp:17:15: error: ‘subscribers’ was not declared in this scope
template<>
struct Event<void, void> : public EventBase<Event<> >
{
        void trigger() const
        {
                // No error here even without `this`, for some reason!
                auto it = subscribers.cbegin();
        }
};