2016-10-19 5 views
2

可変テンプレート引数が与えられたものと同じテンプレートベースのクラスを作成したいとします。std::functionエラーC2061:構文エラー:識別子 'ArgsCopy' をstd :: functionからテンプレート引数をコピーする

using cb_test = std::function<void(int, float, std::string)>; 
Forwarder<cb_test> fwd; 
fwd(5, 3.2, "hello"); 

Visual Studioは、コンパイル・エラーがスローされます、次のように例

template <typename T> 
struct function_traits : public function_traits<decltype(&T::operator())> {}; 

template <typename ClassType, typename ReturnType, typename... Args> 
struct function_traits<ReturnType(ClassType::*)(Args...) const> { 
    template <template<typename... TArgs> class T> 
    using ArgsCopy = T<Args...>; 
}; 

template <typename... Args> 
class _forwarder { 
public: 
    using cb = std::function<void(Args...)>; 

    void operator()(Args... args) { 
     my_cb(args...); 
    } 

private: 
    cb my_cb; 
}; 

template <typename T> 
using Forwarder = function_traits<T>::ArgsCopy<_forwarder>; 

のために私は、このクラスを使用します。これをどうやって解決するのですか?

+0

'テンプレート Forwarder = function_traitsを使用して ::テンプレートArgsCopy <_forwarder>; ' – aschepler

答えて

3

Microsoftのコンパイラは、まさにここに標準に従っていない、とtemplateを追加すると動作するはずです:

template <typename T> 
using Forwarder = function_traits<T>::template ArgsCopy<_forwarder>; 

しかし、あなたはあなたのコードがポータブルになりたい場合は、typenameを追加します。

template <typename T> 
using Forwarder = typename function_traits<T>::template ArgsCopy<_forwarder>; 
関連する問題