2017-09-04 8 views
2

変数テンプレートについての警告が表示されます。私は彼らが何であるか完全にはわからないので、私はそれらが必要であることを完全にはわかりません。 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

クラステンプレートは、1つ以上のテンプレートパラメータに基づいて一連のクラスを定義するテンプレートです。関数テンプレートは、1つ以上のテンプレートパラメータに基づいて一連の関数を定義するテンプレートです。 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>です。

変数テンプレートは、namespace/globalスコープおよびクラスの静的メンバーとしてのみ導入できます。名前空間/グローバルスコープでは、通常、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

関連する問題