前提・実現したいこと
引数のない戻り値の複数の型を持つオーバーロード関数を作りたいのですが,うまくいきません。
具体的には次のような4種類の関数の作成の仕方になります。背景としては,foo()内部でファイルを読み込み,読み込んだ型に従ったmapを返そうというものですが,foo()内部でstring処理をする関係から,3種類の特殊化処理が必要となるものです。なお,試した以下のコード例ではグローバル関数の例ですが,最終的にはクラス関数を念頭に置いています。お分かりの方のご教示をお願いします。
map<T1,T2> foo();
map<int,string> foo();
map<string,int> foo();
map<string,string> foo();
該当のソースコード
c++
1#include<map> 2#include<string> 3using namespace std; 4 5template<typename T1,typename T2> 6map<T1,T2> 7foo(){ 8 map<T1,T2> m; 9 return m; 10} 11template<typename T1> 12map<T1,string> 13foo(){ 14 map<T1,string> m; 15 return m; 16} 17 18template<typename T2> 19map<string,T2> 20foo(){ 21 map<string,T2> m; 22 return m; 23} 24template<> 25map<string,string> 26foo<string,string>(){ 27 map<string,string> m; 28 return m; 29} 30 31void foo_test(){ 32 map<int,string> m1= foo<int,string>(); 33} 34
試したこと
上記のコードはコンパイル可能ですが,foo_test()を実行すると,期待したテンプレート関数<T1,string>でなく,<T1,T2>が呼び出されます。
補足情報(FW/ツールのバージョンなど)
clang
c++17
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/04 10:34