编辑:这不是一个错误,只是我不知道模板化基类中的依赖名称查找(MSVC“有用地”解决了没有错误)。
不久前我写了一个仿函数实现,以及一个使用它的简单“事件”包装器。它在 MSVC 下编译得很好,但是 GCC 给出了一个关于基类中的成员变量的错误subscribers
,没有被声明;更改subscribers
为this->subscribers
解决问题(!)。它似乎只发生在奇怪重复的模板模式和部分模板专业化中。
简化的源代码(对不起,令人费解的模板用法......):
#include <vector>
template<typename TEvent>
struct EventBase
{
protected:
std::vector<int> subscribers;
};
template<typename TArg1 = void, typename TArg2 = void>
struct Event : public EventBase<Event<TArg1, TArg2> >
{
void trigger(TArg1 arg1, TArg2 arg2) const
{
// Error on next line
auto it = subscribers.cbegin();
}
};
template<typename TArg1>
struct Event<TArg1, void> : public EventBase<Event<TArg1> >
{
void trigger(TArg1 arg1) const
{
// Using `this` fixes error(?!)
auto it = this->subscribers.cbegin();
}
};
template<>
struct Event<void, void> : public EventBase<Event<> >
{
void trigger() const
{
// No error here even without `this`, for some reason!
auto it = subscribers.cbegin();
}
};
int main()
{
return 0;
}
我在某处调用未定义的行为吗?我的语法有什么错误吗?这真的是 GCC 中的错误吗?它可能是一个已知的错误吗?任何见解将不胜感激!
更多细节:使用g++ -std=c++11 main.cpp
. 我正在使用 GCC 版本 4.7.2。确切的错误信息:
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