это, вероятно, ошибка новичка, я использую компилятор Microsoft Visual C ++ ноябрь 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>
что я имел ввиду
Из MSDN относительно ошибки компилятора C2244:
Вы не можете частично специализировать шаблон функции.
Я также думаю, что вы должны объявить template
перед классом:
template<typename T>
class MyClass
{
};
Других решений пока нет …