我收到有关变量模板的c ++ 11警告。我不完全确定我需要它们,因为我不完全确定它们是什么。 References that I've found在使用之前不要先定义术语。我的直接想法是,它试图声明一个模板化类型T
的变量,但这段代码编译得很好:
template <class T>
image<T> *image<T>::copy() const {
image<T> *im = new image<T>(w, h, false);
memcpy(im->data, data, w * h * sizeof(T));
return im;
}
什么是变量模板的完整定义,以及为什么这没有变量模板问题
答案 0 :(得分:7)
类模板是一个模板,它根据一个或多个模板参数定义一系列类。函数模板是基于一个或多个模板参数定义一系列函数的模板。 vector
是一个模板类; vector<int>
是从该模板实例化的特定类。
因此,变量模板是一个模板,它根据一个或多个模板参数定义一系列变量:
template<typename T>
T variable_name{};
这是一个变量模板。您可以像任何其他模板一样指定您想要的那个:variable_name<int>
将是int
类型。 variable_name
是模板; variable_name<int>
实际上是一个变量。
当然,你可以做更复杂的事情:
template<typename T>
vector<T> vector_var{};
vector_var<int>
是vector<int>
。
变量模板只能在命名空间/全局范围内引入,也可以作为类的静态成员引入。在命名空间/全局范围内,它们通常被声明为constexpr
(和/或在C ++ 17中,inline
)。它们对于制作常量非常有用:
template<typename T>
inline constexpr bool is_default_constructible_v = std::is_default_constructible<T>::value;
因此,如果您想知道某些内容是否可以默认构建,那么您就不需要稍微笨拙的::value
语法。
变量模板是C ++ 14的一个特性,这就是为什么你的编译器可能会警告你在C ++ 11模式下使用它们的原因。
image<T> *im = new image<T>(w, h, false);
这是不是变量模板。这是一个常规变量,其类型定义非常明确:image<T>
。只有一个名为&#34; im
&#34;的变量。您不能使用im<T>
来获取变量。
该陈述没有定义一系列变量。你拥有的是一系列函数,其中每个包含一个名为im
的变量。该函数是此处的模板,而不是变量。