当函数模板在 class 模板中实例化时?

When function templates are instantiated in a class template?

以下class模板中的函数模板是在什么时候实例化的?

// a.h

#pragma once

template <typename T>
class A {
public:
    template <typename T2> void func1(T2 t);
    void func2(T t);
    T    func3();
    void func4();

    // SECONDARY ISSUE
    // Is there any difference in writing this:
    A& operator=(A const&) = default;
    // or this:
    A<T>& operator=(A<T> const&) = default;
};

-----------------------------

// a.cpp

#include "a.h"

template <typename T>
template <typename T2>
void A<T>::func1(T2 t)
{
    // do sth
}

template <typename T>
void A<T>::func2(T t)
{
    // do sth
}
 
template <typename T>
T A<T>::func3()
{
    T t;
    // do sth
    return t; 
}

template <typename T>
void A<T>::func4()
{
    T t;
    // do sth with t
}

template class A<int>; // explicit instantiation

-----------------------------

// main.cpp

#include "a.h"

int main()
{
  A<int> a1;
  
  a1.func1<double>(1.);
  a1.func1(1.);
  a1.func2(2);
  a1.func3();
  a1.func4();
}

在自由函数模板中,模板在使用具体类型或显式实例化调用时被实例化。

class 模板是怎么回事?我猜 func2() - func4() 是用显式 class 模板实例化 template class A<int>; 实例化的。或者在第一次函数调用时进行实例化,例如 a1.func2(2.)?

func1() 的情况下,实例化可能会在调用 a1.func1<double>(1.); 时发生,因为这是第一次知道第二个模板参数 T2

关于次要问题: 我写 AA<T> 有关系吗?我认为是一样的,但我不确定。

class 模板的方法仅在调用时实例化。为了便于说明,请考虑:

#include <type_traits>

template <typename T>
struct foo {
    void only_for_int() {
        static_assert(std::is_same<T,int>::value);
    }
};


int main(){
    foo<int> f;
    f.only_for_int();   // OK (T == int)
    foo<double> d;      // OK
    //d.only_for_int(); // ERROR: static assert failed
}

创建 foo<double> 没问题。你只是不能调用它的方法 only_for_int。 并非每个方法都必须有效这一事实非常方便,允许不能支持所有模板要求的类型至少使用模板方法的一个子集。