質問内容
std::vectorをユニバーサル参照で受け取り
そのvectorの要素の型と同じ変数varを作り
その新たに作成したvectorにコピー/ムーブ
したあとそれらを使って
処理を行う関数を作りたいのですが
エラーが発生してしまいます。
どうすればvector内の要素の型を取得できますか。
どうかよろしくお願い致します。
c++
1#include <utility> 2#include <vector> 3 4template<class Vec,typename Type> 5void func(Vec<Type>&& vec){ 6 Type var = 0;// ← Typeが推論できない 7 auto vec2 = std::forward<Vec>(vec); 8 // 9 // 変数varやvec2を使った処理が続く(省略) 10 // 11} 12 13int main(void) 14{ 15 std::vector<int> left_ref = {1,2,3,4,5}; 16 func(left_ref);//左辺値 17 18 func(std::vector<int>{{1,2,3,4,5}});//右辺値 19 return 0; 20} 21
上記コードのエラーコード
terminal
1/***/main.cpp:5:11: error: ‘Vec’ is not a template 2 void func(Vec<Type>&& vec){ 3 ^~~ 4/***/main.cpp: In function ‘int main()’: 5/***/main.cpp:16:18: error: no matching function for call to ‘func(std::vector<int>&)’ 6 func(left_ref);//左辺値 7 ^ 8/***/main.cpp:5:6: note: candidate: template<class Vec, class Type> void func(Vec&&) 9 void func(Vec<Type>&& vec){ 10 ^~~~ 11/***/main.cpp:5:6: note: template argument deduction/substitution failed: 12/***/main.cpp:16:18: note: couldn't deduce template parameter ‘Type’ 13 func(left_ref);//左辺値 14 ^ 15/***/main.cpp:18:39: error: no matching function for call to ‘func(std::vector<int>)’ 16 func(std::vector<int>{{1,2,3,4,5}});//右辺値 17 ^ 18/***/main.cpp:5:6: note: candidate: template<class Vec, class Type> void func(Vec&&) 19 void func(Vec<Type>&& vec){ 20 ^~~~ 21/***/main.cpp:5:6: note: template argument deduction/substitution failed: 22/***/main.cpp:18:39: note: couldn't deduce template parameter ‘Type’ 23 func(std::vector<int>{{1,2,3,4,5}});//右辺値 24 25
エラー内容は
Vecはテンプレートではない。
funcの使い方がおかしい。
テンプレート引数の控除/置換に失敗しました。
テンプレートパラメータ「Type」を推定できませんでした。
とのことですが
ひょっとかしたらc++ではテンプレート引数のテンプレート引数
を推論できないのかな?
といったかんじです。
試したこと
c++
1#include <utility> 2#include <vector> 3#include <memory> 4#include <iostream> 5 6template<typename Type> 7void func(const std::vector<Type>& vec){ 8 Type var = 0; 9 auto vec2 = vec; 10 // 11 // 変数varやvec2を使った処理が続く(省略) 12 // 13 14 std::cout << "コピー" << std::endl; 15} 16 17template<typename Type> 18void func(std::vector<Type>&& vec){ 19 Type var = 0; 20 auto vec2 = std::move(vec); 21 // 22 // 変数varやvec2を使った処理が続く(省略) 23 // 24 25 std::cout << "ムーブ" << std::endl; 26} 27 28int main(void) 29{ 30 std::vector<int> left_ref = {1,2,3,4,5}; 31 func(left_ref);//左辺値 32 33 func(std::vector<int>{{1,2,3,4,5}});//右辺値 34 return 0; 35}
上記のようにオーバーロードで2つの関数を作れば
コンパイルできますが
std::forwardとユニバーサル参照を使って1つの関数で
済ましてしまいたいです。
開発環境の備考
ツールの種類 | ツールの名前 | バージョン |
---|---|---|
コンパイラ | clang++ | 6.0.0 |
OS | Linux Mint | 18.3 |
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/06 07:45
退会済みユーザー
2020/07/06 14:00 編集