2014-09-22 34 views
3

我定义了一个可变参数结构像这样可变参数结构规范

template <class T, class... TRest> 
struct Opa 
{ 
    Opa() 
    { 
     std::cout << "Mutiple-arguments template"; 
    } 
}; 

,并希望专门它与1个参数的情况下,只有如下

template <> 
struct Opa<class T> 
{ 
    Opa() 
    { 
     std::cout << "One-argument template"; 
    } 
}; 

但是编译器会忽略这第二个结构,和来自

的输出
Opa<int> opa; 
Opa<int, int> opa_opa; 

Mutiple-arguments template, Mutiple-arguments template

指定一个参数的模板以不同的方式,例如

template <class T> 
struct Opa 
{...} 

导致编译错误。 我意识到我的问题很简单,但是使用谷歌搜索并没有帮助。 所以请不要把腐烂的西红柿扔给我,谢谢你的回答。

+0

你的variadic模板在哪里? – 2014-09-22 09:35:45

回答

7

您的单参数专业化的语法是错误的。你可能完全专注于现场申报class T。你想这样的:

template <class T> 
struct Opa<T> 
{ 
    Opa() 
    { 
     std::cout << "One-argument template"; 
    } 
}; 

Live example

部分特例被列出参数在尖括号中的部分专业化的template后宣布(在你的情况下,单一类型的参数,class T),和列出参数为主模板名称后面的尖括号中的主模板(在您的情况下,单个类型参数,T)。