2012-06-17 1 views
4

У меня проблема с этим кодом:Специализируясь на VARIADIC функции члена шаблона нешаблонного класса

#include <iostream> 

using namespace std; 

class A { 
public: 
     template<typename T, typename... Args> 
     void stuff(Args... args); 
}; 

template<typename T, typename... Args> 
void A::stuff(Args... args) { 
     cout << sizeof...(args) << endl; 
} 

template<> 
void A::stuff<int>() { 
     cout << "int" << endl; 
} 

int main() { 
     A a; 
     A b; 

     a.stuff<char>(); 
     b.stuff<int>(); 
} 

Trying to compile it, я получаю эту ошибку:

template-id 'stuff<int>' for 'void A::stuff()' does not match any template declaration 

Что я делаю неправильно? Я пробовал это без вариативности, и это сработало, но как я специализирую функцию Variadic template member?

+0

Это выглядит хорошо, но я думаю, что ошибка имеет какое-то отношение к тому, что шаблоны функций не могут быть частично специализированными. Я не знаю, как вы получите синтаксис прямо, специализируясь на первом параметре (T) и не указывая тип «variadic» (args). –

+0

@AdityaKumar Я не частично специализирую шаблон, он полностью специализирован. –

+0

Да, я понимаю. Мне интересно, есть ли еще поддержка компилятора. –

ответ

5

Это похоже на ошибку. Проблема не ограничивается полностью специализированными шаблонами функций-членов. Это могут быть воспроизведены даже с шаблонами свободной функции следующим образом:

template<typename T, typename... Args> 
void stuff2(Args... args); 

template<typename T, typename... Args> 
void stuff2(Args... args) { 
    cout << sizeof...(args) << endl; 
} 

template<> 
void stuff2<int>() { 
    cout << "int" << endl; 
} 
int main() {} 

Хотя лязг 3,2 компилирует это просто отлично, GCC жалуется:

spec.cpp:31:6: error: template-id 'stuff2' for 'void stuff2()' does not match any template declaration

Существует родственный SO question.

A message, похоже, подтверждает, что это действительно ошибка.

+0

вы также можете добавить текущее возможное решение, где текущая проблема может быть решена путем перегрузки 'stuff2()'. – iammilind

+0

@iammilind: Это не устраняет проблему OP (которая касается шаблонов функций-членов, а не бесплатных шаблонов функций). – dirkgently

+0

Уже подтвердил ответ, но все же его можно решить в некоторой степени (http://ideone.com/2WimQ). – iammilind

Смежные вопросы