给出以下代码:
void f()
{
class A
{
template <typename T>
void g() {}
};
}
Run Code Online (Sandbox Code Playgroud)
g ++ 4.4(以及 g++-4.6 -std=gnu++0x)抱怨:"本地类中成员模板的声明无效".
显然,本地类不允许有模板成员.这种限制的目的是什么?它会在C++ 0x中删除吗?
注意:如果我将本地类本身设为模板,而不是给它一个模板成员:
void f()
{
template <typename T>
class A
{
void g() {}
};
}
Run Code Online (Sandbox Code Playgroud)
我得到"错误:模板声明不能出现在块范围内".
考虑两个struct具有不同成员类型别名的s:
struct foo { using x = int; };
struct bar { using y = float; };
Run Code Online (Sandbox Code Playgroud)
给定T的template情况下,我想无论是T::x还是T::y取决于什么T是:
template <typename T>
auto s()
{
auto l = [](auto p)
{
if constexpr(p) { return typename T::x{}; }
else { return typename T::y{}; }
};
return l(std::is_same<T, foo>{});
}
int main()
{
s<foo>();
}
Run Code Online (Sandbox Code Playgroud)
g++编译上面的代码,同时clang++产生这个错误:
error: no type named 'y' in 'foo'
else { return typename …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
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 …