2015-01-21 86 views
2

我已經通過在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中添加帶有新類型名稱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的實際類型。我該如何解決這個問題?提前謝謝你的幫助。

回答

0

在執行時是一個類時,你使用的模板參數T。現在Implmented是模板類,您需要使用所謂的模板模板參數,如下所示:

#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; 
} 
+0

非常感謝!起初,我認爲我必須使用模板的模板,但我不知道如何寫。這也適用於以上答案。 – 2015-01-21 11:54:02

2

在這一行:

Base<Implemented, int> x; 

Implemented不再是一個類型,現在你做它的模板。但Base仍預計一類 - 所以給它一個:

Base<Implemented<int>, int> x; 
+0

非常感謝Barry。它完全有效!如果我在Base類型S和Implemented類型S之間使用不同類型,它會按我的意圖導致編譯錯誤。 – 2015-01-21 11:51:59