此代码编译时没有任何警告或错误,并且是可执行的.
template<class T>
struct testclass
{
template<int I>
class inner {};
template<int I>
void f(inner<I> ) {}
};
int main()
{
testclass<bool> test;
test.f(testclass<bool>::inner<3>()); // l. 13
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想做的是省略第testclass::13行:
test.f(inner<3>());
Run Code Online (Sandbox Code Playgroud)
这是行不通的.我可以在testclass'定义中添加任何内容,以便我的代码有效吗?
允许使用C++ 11.
通常,没有允许这种推断的全局编译器标志,因为这会破坏名称范围.
但是,您可以在外部使用typedef(或者在模板的情况下 - 具有类型别名).在你的情况下,它将是:
template <int I> using inner = testclass::inner<I>;
Run Code Online (Sandbox Code Playgroud)
这必须写在全局命名空间中,而不是在testclass.
请注意,模板别名是 C++ 11的一项功能
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |