将模板typename添加到两个模板类

时间:2015-01-21 01:39:18

标签: c++ templates

我通过在C ++上使用模板技术学习了这个代码,就像继承一样。这段代码有效。

#include <iostream>
using namespace std;

template < typename T >
class Base {
public:
    explicit Base(const T& policy = T()) : m_policy(policy) {}
    void doSomething() 
    {
        m_policy.doA();
        m_policy.doB();
    }
private:    
    T m_policy;
};

class Implemented {
public:
    void doA() { cout << "A"; };
    void doB() { cout << "B"; };
};

int main() {
    Base<Implemented> x;
    x.doSomething();
    return 0;
}

但是,是否可以在doA和doB中添加具有新typename S的参数?例如,此代码不会因类型/值不匹配错误而起作用。

#include <iostream>
using namespace std;

template < typename T, typename S >
class Base {
public:
    explicit Base(const T& policy = T()) : m_policy(policy) {}
    void doSomething() 
    {
        m_policy.doA(m_s);
        m_policy.doB(m_s);
    }
private:    
    T m_policy;
    S m_s;
};

template < typename S >
class Implemented {
public:
    void doA(S& s) { cout << "A" << s; };
    void doB(S& s) { cout << "B" << s; };
};

int main() {
    Base<Implemented, int> x;
    x.doSomething();
    return 0;
}

我想我必须让class Base和Implemented都知道main()的实际S类型。我该如何解决这个问题?感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

在这一行:

Base<Implemented, int> x;

Implemented不再是类型,现在您将其设为模板。但是Base仍然需要一个类型 - 所以给它一个:

Base<Implemented<int>, int> x;

答案 1 :(得分:0)

当Implemented是一个类时,您使用了模板参数T。现在Implemented是一个模板类,你需要使用一个所谓的模板模板参数,如下所示:

#include <iostream>
using namespace std;

template < template <class TS> class T, typename S >
class Base {
public:
    explicit Base(const T<S>& policy = T<S>()) : m_policy(policy) {}
    void doSomething() 
    {
        m_policy.doA(m_s);
        m_policy.doB(m_s);
    }
private:    
    T<S> m_policy;
    S m_s;
};

template < typename S >
class Implemented {
public:
    void doA(S& s) { cout << "A" << s; };
    void doB(S& s) { cout << "B" << s; };
};

int main() {
    Base<Implemented, int> x;
    x.doSomething();
    return 0;
}