Ошибка VC++ Variadic-Template-Template C2244: невозможно сопоставить определение функции с существующим объявлением

это, вероятно, ошибка новичка, я использую компилятор Microsoft Visual C++, ноябрь 2012 г., и когда я пытаюсь скомпилировать это:

#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>, что я и имел в виду


person csirke128    schedule 17.11.2012    source источник
comment
VC на самом деле не поддерживает вариативные шаблоны. Они просто подражают им. Так что неудивительно, что это не работает. Последний пример на самом деле не должен работать, std::vector имеет более одного параметра шаблона.   -  person mfontanini    schedule 17.11.2012
comment
@mfontanini неправда. Почитайте про ОСАГО, упомянутое автором.   -  person Mateusz Pusz    schedule 17.11.2012
comment
@user1832244 user1832244 Ваш код отлично компилируется в gcc 4.7.2 и clang, так что, вероятно, это одна из многих ошибок, появившихся в этом VS CTP.   -  person Mateusz Pusz    schedule 17.11.2012
comment
Ну, Nov CTP не является компилятором производственного качества и, следовательно, ошибка. Кстати, этот код отлично компилируется на GCC4.8.   -  person Sarang    schedule 17.11.2012
comment
@MateuszPusz Холли Бьярнс, наконец-то они это реализовали.   -  person mfontanini    schedule 17.11.2012
comment
@Sarang C++11 является C++. Пожалуйста, не удаляйте тег с этих вопросов. Уважаемые рецензенты редактирования, пожалуйста, не переставайте думать.   -  person R. Martinho Fernandes    schedule 17.11.2012
comment
@mfontanini это обновлять не так уж и сложно, так что в следующий раз, когда вы поместите компилятор отключен, вы знаете, о чем, черт возьми, вы говорите :) Вариады никогда не эмулировались до такой степени, что вы могли использовать синтаксис. Эффект был сымитирован w.r.t. наборы перегрузки в стандартной библиотеке.   -  person sehe    schedule 18.11.2012
comment
Это ошибка. Откройте отчет об ошибке в Microsoft Connect или, если вы не хотите этого делать, позвольте мне знаю, и я могу сообщить об ошибке. Спасибо, что попробовали CTP!   -  person James McNellis    schedule 19.11.2012
comment
@JamesMcNellis: Это действительно ошибка компилятора или просто связано с тем, как эмулируются переменные числа в текущей реализации stdlib?   -  person MFH    schedule 25.01.2013
comment
@MFH вам не нужна stdlib для воспроизведения этой ошибки, если вы удалите вызов функции из main, он все равно не скомпилируется   -  person csirke128    schedule 29.01.2013


Ответы (1)


Из MSDN относительно ошибки компилятора C2244:

Вы не можете частично специализировать шаблон функции.

Я также думаю, что вам нужно объявить template перед классом:

template<typename T>
class MyClass
{
};
person JonathanL    schedule 12.04.2014