2017-09-04 80 views
2

我得到关于变量模板的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; 
} 

什么是变量模板的全面的定义,以及为什么这种没有可变模板问题

+4

这里你去:[变量模板](http://en.cppreference.com/w/cpp/language/variable_template)。使用[cppreference。COM](http://en.cppreference.com/w/)。 – Ron

+0

我也看到了这个网站,并没有觉得它特别有用。它给出了“一个变量模板定义了一系列变量或静态数据成员。”和几个例子。我的例子中的代码对我来说似乎是基于cppreference定义中有限信息的另一个示例。为什么不是? – Scott

+0

这看起来不像可变模板,更像是一个成员函数模板。 – VTT

回答

7

类模板是一个基于一个或多个模板参数定义一系列类的模板。函数模板是一个基于一个或多个模板参数定义一系列函数的模板。 vector是一个模板类; vector<int>是从该模板实例化的特定类。

可变模板因此是一个模板,它定义了一系列变量的,基于一个或更多个模板参数:

template<typename T> 
T variable_name{}; 

即是可变模板。您可以指定您想要的模板,就像其他任何模板一样:variable_name<int>将是intvariable_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>。只有一个变量名为“im”。你不使用im<T>来获得一个变量。

该声明没有定义变量族。你有什么是函数的家庭,其中他们每个人包含一个变量称为im。函数是这里的模板,而不是变量。

+0

这更清晰。我特定的违规代码是一个函数参数:'std :: unordered_map * counter'在我看来,这与声明'image * im'具有相同的格式... ... – Scott

+0

@Scott:你的问题是“什么是变量模板“,而不是”为什么此代码会给出有关变量模板的警告?“如果这就是你想知道的,你应该问这个问题。但不要改变这一个。如果你问这个问题,请提供重现问题的代码,以及你正在使用的编译器(使用编译器的版本号)和编译器开关。 –

+0

我根本没有改变这个问题。事实上,在我看来,这个问题最好是“什么是可变模板”,所以我把它放在原来的位置,并提到我继续混淆作为评论。 – Scott