Iva*_*ich 16 c++ lambda templates language-lawyer c++11
我有以下代码:
template <class T>
class Outer
{
public:
Outer();
template <class U>
void templateFunc()
{
}
private:
class Inner
{
public:
Inner(Outer& outer)
{
outer.templateFunc<int>();
Outer* outer_ptr = &outer;
[outer_ptr]()
{
outer_ptr->templateFunc<int>();
}();
}
};
Inner m_inner;
};
template <class T>
Outer<T>::Outer()
: m_inner(*this)
{
}
int main()
{
Outer<double> outer;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,有一个模板类包含一个嵌套类,它在构造函数中调用其封闭类的一些模板方法.AFAIK,即使封闭类是一个模板类 - 对于嵌套类,它是一个非依赖名称,因此调用其模板方法不template应该是一个问题.当我在嵌套类的构造函数中定义lambda,捕获指向外部类的指针,并尝试调用相同的模板方法时,问题就出现了 - g ++ 7.2给出了以下编译错误:
Run Code Online (Sandbox Code Playgroud)prog.cc: In lambda function: prog.cc:22:41: error: expected primary-expression before 'int' outer_ptr->templateFunc<int>(); ^~~ prog.cc:22:41: error: expected ';' before 'int'
但是,g ++ - 5.4和g ++ - 6.3编译这段代码就好了.因此,似乎g ++ - 7.2将outer_ptrlambda中的类型视为依赖名称 - 我无法理解为什么.谁可以给我解释一下这个?
是的,这是 gcc 回归。归档为82980。
这是一个简化的示例:
template <class T>
struct Outer
{
template <class U>
void f();
void bar(Outer outer) {
[outer](){ outer.f<int>(); };
}
};
int main() { }
Run Code Online (Sandbox Code Playgroud)
outer.f是当前实例化的成员访问权限,因此该表达式不应视为类型相关,因此您不需要提供关键字template。