2016-04-17 12 views
0

Visual C++ 2013でテンプレート関数のテンプレートを使用するのが無効です。 最初にテンプレート関数ポインタ(Tから文字列に変換するために使用されます) :なぜVisual C++でテンプレート関数のテンプレートが無効です

template<class T> 
struct TemplateFn 
{ 
    typedef string(*T2STRING)(T); 
}; 

そして私は

template<class T> 
vector<string> Vector2StringVector(vector<T> a_vt, TemplateFn<T>::T2STRING a_fn) 
{ 
    auto vtString = vector<string>(); 
    for (auto i = a_vt.begin(); i != a_vt.end(); i++) 
    { 
     vtString.push_back(a_fn(*i)); 
    } 
    return vtString; 
} 

とコンパイラの出力がエラーになる別のテンプレート関数を定義した:C2061構文エラー:識別子「T2STRING」 最後に、私はすぐ下にコードを変更します

template<class T> 
vector<string> Vector2StringVector(vector<T> a_vt, string(*T2STRING)(T)) 
{ 
    auto vtString = vector<string>(); 
    for (auto i = a_vt.begin(); i != a_vt.end(); i++) 
    { 
     vtString.push_back(T2STRING(*i)); 
    } 
    return vtString; 
} 

これで大丈夫です。 それは私にとても結構です。 TemplateFn :: T2STRINGが好きなので、この方法を使用するエレガントな方法はありますか? ありがとう

答えて

2

T2STRINGは依存するネストされた型です。したがって、コンパイラにヒントを与える必要があります。あなたの関数ヘッダーが

vector<string> Vector2StringVector(vector<T> a_vt, typename TemplateFn<T>::T2STRING a_fn) 

に変更ところで、あなたは(追加std::back_inserterで)std::transformを再実装してみませんか?

関連する問題