如何解决嵌套模板类方法语法 C ++ 20:缩写的功能模板
如果我有一个类型为A
的类T
,并且该类有一个类型为Foo
的方法U
template <class T>
class A
{
public:
template <class U>
void Foo();
};
要在类之外定义该函数,我需要两个模板语句,如
template <class T>
template <class U>
void A<T>::Foo() {} // this compiles
以下内容无法编译
template <class T,class U>
void A<T>::Foo() {} // this does not compile
有错误
prog.cpp:10:6: error: no declaration matches ‘void A<T>::Foo()’
void A<T>::Foo() {}
^~~~
prog.cpp:6:7: note: candidate is: ‘template<class T> template<class U> void A<T>::Foo()’
void Foo();
^~~
prog.cpp:2:7: note: ‘class A<T>’ defined here
class A
^
是否有更简洁/紧凑的方式在上述单个语句中定义两种模板类型?
解决方法
C ++ 20:缩写的功能模板
是否有更简洁/紧凑的方式在上述单个语句中定义两种模板类型?
从C ++ 20开始,您可以使用abbreviated function templates,它允许以更紧凑的方式声明(以后)定义函数模板。但是,此方法仅限于可以通过模板参数推导来推断的类型模板参数,因为占位符类型(auto
或SomeConcept auto
)必须出现在缩写函数模板声明的参数列表中。
template <typename T>
struct A {
void foo(auto);
};
template <typename T>
void A<T>::foo(auto) {}
请注意,void foo(auto)
等效于template<typename T> void foo(T)
,因为前者声明的函数模板具有与单个占位符类型相对应的单个(发明的)模板参数。这意味着可以将同一实体的缩写功能模板语法和经典功能模板语法混合使用(例如,使用一种语法进行声明,而使用另一种语法进行定义):
template <typename T>
struct A {
template <typename U>
void foo(U);
};
template <typename T>
void A<T>::foo(auto) {}
template <typename T>
struct B {
template <typename U>
void foo(U,auto);
};
template <typename T>
void B<T>::foo(auto,auto) {}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。