有人可以告诉我这段代码出了什么问题:
template<typename B=int> // <<<< =int is provoking the error
struct Foo
{
std::array<B,10> data;
template<typename F>
void iterate(F f) const
{
for(unsigned i=0; i<10; i++) {
f(i, data[i]);
}
}
friend std::ostream& operator<<(std::ostream& os, const Foo<B>& a) // Line 17
{
a.iterate([&os](unsigned i, const B& x) {
os << i << "=" << x << "\n";
});
return os;
}
};
GCC 4.8.1和--std=c++11
的错误消息:
test.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Foo<B>&)’:
test.cpp:17:41: error: default argument for template parameter for class enclosing ‘operator<<(std::ostream&, const Foo<B>&)::__lambda0’
a.iterate([&os](unsigned i, const B& x) {
答案 0 :(得分:1)
a.iterate([&os](unsigned i, const B& x) {
os << i << "=" << x << "\n";
});
此处介绍的lambda函数具有在operator<<
函数体内的函数范围内声明“未命名”本地类的效果。我们可以编写自己的函子对象来获得类似的效果:
struct lambda {
std::ostream& os;
lambda(std::ostream& os_) : os(os_) {}
void operator()(unsigned i, const B& x) {
os << i << "=" << x << "\n";
}
};
a.iterate(lambda(os));
这引发了与g ++类似的错误:
error: default argument for template parameter for class enclosing
‘operator<<(std::ostream&, const Foo<B>&)::lambda::lambda’
这是一个SSCCE:
template <typename T = int>
struct Foo
{
friend void f() {
struct local {};
}
};
它引发的错误:
error: default argument for template parameter for class enclosing
‘f()::local::local’
这已被报告为GCC bug 57775。
正如@PiotrNycz所指出的,你可以通过将函数operator<<
的主体移到类模板之外来解决。