为什么这样做:
template<typename Base, typename Acc>
struct Foo
{
Base base;
Acc acc;
auto operator()(unsigned i) const -> decltype(acc(base(i)))
{ return acc(base(i)); }
};
这会产生编译错误:
template<typename Base, typename Acc>
struct Foo
{
auto operator()(unsigned i) const -> decltype(acc(base(i)))
{ return acc(base(i)); }
Base base;
Acc acc;
};
错误:“base”没有依赖于模板的参数 参数,所以'base'的声明必须是[-fpermissive]
这是否真的是标准或GCC 4.8.1的错误?
我找到了一个更短的示范示例:
#include <iostream>
struct Foo
{
int x;
auto getx() const -> decltype(x) // OK
{ return x; }
auto gety() const -> decltype(y) // ERROR
{ return y; }
int gety2() const // OK
{ return y; }
int y;
};
int main(int argc, char* argv[])
{
Foo f {1,2};
std::cout << f.getx() << std::endl;
std::cout << f.gety() << std::endl;
}
答案 0 :(得分:2)
预计在函数声明之前只声明成员。如标准§5.1.1项目3中所示:
如果声明声明了成员函数... [注意:只有先前声明的类成员 声明是可见的。 - 后注]