c++ - 将模板类型名添加到两个模板类

标签 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 中添加具有新类型名 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;
}

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

最佳答案

在这一行中:

Base<Implemented, int> x;

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

Base<Implemented<int>, int> x;

关于c++ - 将模板类型名添加到两个模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28058229/

相关文章:

c++ - 有选择地仅对翻译单元的一部分禁用 GCC 警告

c++ - 使用递归获取变量的奇怪值

c++ - Visual Studio MFC 工具栏编辑器图标顺序不会更新

C++ createObject() 工厂

c++ - "No matching function for call to"模板 C++

c++ - 如何从运行时值转换为模板参数?

c++ - 如何使用模板重载流插入运算符?

c++ - 确定作为模板参数给出的函数的返回类型

c++ - (ostream& outs) 在类函数参数 C++

c++ - 使用另一个聚合对象初始化聚合列表