2017-06-20 11 views
0

我想用一个函数传递参数给不同的类,所以我用类模板专业化和可变参数函数模板,波纹管是代码:为什么这个代码与模板特错误

#include <iostream> 
using namespace std; 

template <typename T0, typename T1> 
class Package 
{ 
    T0 Data0; 
    T1 Data1; 
public: 
    Package(T0 data0, T1 data1): Data0(data0), Data1(data1) {} 
    void Display() 
    { 
     cout << Data0 << " " << Data1 << endl; 
    } 
}; 

template <typename T0> 
class Package<T0, void> 
{ 
    T0 Data0; 
public: 
    Package(T0 data0): Data0(data0) {} 
    void Display() 
    { 
     cout << Data0 << endl; 
    } 
}; 

template <> 
class Package<void, void> 
{ 
public: 
    Package() {} 
    void Display() 
    { 
     cout << "have no member" << endl; 
    } 
}; 

template <typename... Args> 
void Post(Args... args) 
{ 
    Package<Args...> pak = Package<Args...>(args...); 
    pak.Display(); 
} 

int main() 
{ 
    int x = 5; 
    float y = 0.9; 
    Post(x, y); 
    Post(x); 
    Post(); 
    return 0; 
} 

我有这样的错误:

In instantiation of 'void Post(Args ...) [with Args = {int}]': 
52:15: required from here 
43:26: error: wrong number of template arguments (1, should be 2) 
5:11: error: provided for 'template<class T0, class T1> class Package' 
43:26: error: wrong number of template arguments (1, should be 2) 
5:11: error: provided for 'template<class T0, class T1> class Package' 
In instantiation of 'void Post(Args ...) [with Args = {}]': 
53:14: required from here 
43:26: error: wrong number of template arguments (0, should be 2) 
5:11: error: provided for 'template<class T0, class T1> class Package' 
43:26: error: wrong number of template arguments (0, should be 2) 
5:11: error: provided for 'template<class T0, class T1> class Package' 

包可以带2/1/0参数,Post可以提供2/1/0参数,但是为什么有这个错误呢?谢谢。

+0

的'Package'专业化的构造函数(不是过载一套“组合”,因为它们属于到不同的类型)可以使用2/1/0个参数,但是Package类模板本身总是需要两个模板参数。也就是说,即使没有可变功能,“包装”也是非法的。请参阅@ max66的解决方案。 – aschepler

回答

2

尝试增加默认模板参数Package

template <typename T0 = void, typename T1 = void> 
class Package 
+0

它工作,谢谢。 – yintao

0

Package can take 2/1/0 parameters, Post can provide 2/1/0 parameters, but why has this error?

的专长帮助编译器搞清楚当模板实例使用哪一个。

如果使用

Package<void, void> p1; 

则使用最后一个专业化。如果您使用

Package<int, void> p1; 
Package<double, void> p2; 

使用第一个专业化。

如果使用

Package<int, float> p1; 
Package<double, char> p2; 

使用原始类模板。

但是,无论使用哪一个,您仍然需要两个模板参数。

如果您希望能够使用

Package<int> p1; 

,你将不得不为第二个参数的默认类型,如被the other answer建议。

template <typename T0 = void, typename T1 = void> 
class Package { ... }; 
0

您使用void,而不是没有类型,你可能你的类更改为:

template <typename ...Ts> class Package; 

template <typename T0, typename T1> 
class Package<T0, T1> 
{ 
    T0 Data0; 
    T1 Data1; 
public: 
    Package(T0 data0, T1 data1): Data0(data0), Data1(data1) {} 
    void Display() const 
    { 
     std::cout << Data0 << " " << Data1 << std::endl; 
    } 
}; 

template <typename T0> 
class Package<T0> 
{ 
    T0 Data0; 
public: 
    explicit Package(T0 data0) : Data0(data0) {} 

    void Display() const 
    { 
     std::cout << Data0 << std::endl; 
    } 
}; 

template <> 
class Package<> 
{ 
    void Display() const { std::cout << "have no member" << std::endl; } 
}; 
相关问题