2

これはおそらく newb のエラーです。私は Microsoft Visual C++ Compiler Nov 2012 CTP を使用しており、これをコンパイルしようとすると:

#include <tuple>

class A
{
public:
    template <class... Fs, template <class...> class T>
    void foo(T<Fs...>);
};

template <class... Fs, template <class...> class T>
void A::foo(T<Fs...>)
{
}

int main()
{
    A a;
    a.foo(std::make_tuple(10,10));
}

次のエラーが表示されます。

error C2244: 'A::foo' : unable to match function definition to an existing declaration
definition
'void A::foo(T<Fs...>)'
existing declarations
'void A::foo(T<Fs...>)'

関数をインライン化すると、コンパイルしてやりたいことを実行しますが、関数をヘッダーファイルに配置する必要があります

ただし、次のコードはエラーなしでコンパイルされます。

#include <vector>

class A
{
public:
    template <class Fs, template <class> class T>
    void foo(T<Fs>);
};

template <class Fs, template <class> class T>
void A::foo(T<Fs>)
{
}

int main()
{
    A a;
    a.foo(std::vector<int>());
}

問題は、どうすれば可変個引数テンプレートで同じことを達成できるかということです

編集:

提案されたように、Microsoft Connect にID :771567でバグ レポートを提出しました。

また、ベクトルの例は悪いものでした (それは を与えます<std::_Simple_types<int>,std::_Vector_val>が、コンパイルはします) が、ペアとテンプレート引数で試してみると:

template <class F, class G, template <class,class> class T>

あなたは<F,G,std::pair>私が意味したものを得るでしょう

4

1 に答える 1

0

コンパイラ エラー C2244 に関する MSDN から:

関数テンプレートを部分的に特殊化することはできません。

templateまた、クラスの前で宣言する必要があると思います:

template<typename T>
class MyClass
{
};
于 2014-04-12T19:39:05.073 に答える