嵌套模板类方法语法

Posted

技术标签:

【中文标题】嵌套模板类方法语法【英文标题】:Nested template class method syntax 【发布时间】:2020-08-21 12:55:10 【问题描述】:

如果我有一个以 T 类型为模板的类 A,并且该类有一个以 U 类型为模板的方法 Foo

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
       ^

有没有更简洁/紧凑的方式来像上面一样在单个语句中定义两种模板类型?

【问题讨论】:

我担心没有其他“紧凑”的方式 【参考方案1】:

C++20:缩写函数模板

有没有更简洁/紧凑的方式来像上面那样在单个语句中定义两种模板类型?

从 C++20 开始,您可以使用 abbreviated function templates,它还允许以更紧凑的方式声明(稍后)定义函数模板。但是,这种方法仅限于可以通过模板实参推导推断出的类型模板参数,因为占位符类型(autoSomeConcept auto)必须出现在缩写函数模板声明的参数列表中。

template <typename T>
struct A 
    void foo(auto);
;

template <typename T>
void A<T>::foo(auto) 

注意void foo(auto) 等价于template&lt;typename T&gt; 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) 

【讨论】:

以上是关于嵌套模板类方法语法的主要内容,如果未能解决你的问题,请参考以下文章

C++中,一个类模板的内部又嵌套了一个类模板,语法应该是怎么样的

模板化类方法定义语法

具有嵌套类声明的类模板 (C++)

为啥不能推导出嵌套在模板类中的枚举的模板参数?

gcc 编译错误:模板类表中嵌套类 A ​​的成员在嵌套朋友类中不可见。为啥?

模板化类的模板化成员方法可以在类定义之外定义吗