何时实例化以下类模板中的功能模板?
// 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();
}
在自由函数模板中,当使用具体类型或显式实例化调用模板时,将实例化该模板。
类模板是什么情况?我猜func2() - func4()
是用显式类模板实例化template class A<int>;
实例化的。还是在第一个函数调用时(例如a1.func2(2.)
时)实例化?
对于func1()
,实例化可能是通过调用a1.func1<double>(1.);
进行的,因为这是第一次知道第二个模板参数T2
的情况?
关于次要问题:
我写A
还是A<T>
有关系吗?我认为是相同的,但我不确定。
答案 0 :(得分:3)
类模板的方法仅在被调用时实例化。为了说明,请考虑:
#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
。
并非每种方法都必须有效的事实非常方便,可以允许不能支持所有模板要求的类型使用至少一部分模板方法。