【问题标题】:Cannot extend C++ template class by additional parameter无法通过附加参数扩展 C++ 模板类
【发布时间】:2023-01-24 19:51:35
【问题描述】:

我是 C++ 模板的初学者,我无法从带有附加参数的基类继承我的派生类。我有基类:

// idproc.h file
#include <array>

using namespace std;
template<class T, int numGroups>
class BaseSequence
{
public:
    int m_numGroups;
    array<T, numGroups> m_groups;
    int m_currPos;

public:
    BaseSequence() : m_numGroups(numGroups), m_currPos(0) {
        std::fill(begin(m_groups), end(m_groups), T());
    }
    virtual string PrintSequence() {
        string identifier;
        for (auto &&group : m_groups)
        {
            identifier += to_string(group) + "-";
        }
        identifier.pop_back();
        return identifier;
    }
};

我的派生类是:

template<class T, int numGroups, int maxVal>
class IdentifierSequence : BaseSequence<T, numGroups> 
{
    int m_maxVal;
public:
    using BaseSequence<T, numGroups>::PrintSequence;
    IdentifierSequence(int maxVal): m_maxVal(maxVal) {}; // compiler error
};

如您所见,我的 IdentifierSequence 有一个名为 m_maxVal 的附加参数,我需要在构造函数中对其进行初始化。

我通过以下方式使用它:

// main.cpp file
    
#include <iostream>
#include "idproc.h"

int main(int argc, char** argv) {

    IdentifierSequence<int, 10, 2> is;
    std::cout << is.PrintSequence() << std::endl;

    return 0;
}

请向我解释如何解决此问题。

【问题讨论】:

  • 为什么你有一个与构造函数参数同名的模板参数?
  • 你应该在问题中包括编译器错误

标签: c++ templates


【解决方案1】:

您的模板参数和构造函数接受两个名为maxVal 的变量,因此您有歧义错误。您应该更改其中任何一个的名称。

template<class T, int numGroups, int maxVal_templ> // note: maxVal -> maxVal_templ
class IdentifierSequence : BaseSequence<T, numGroups> 
{
    int m_maxVal;
public:
    using BaseSequence<T, numGroups>::PrintSequence;
    IdentifierSequence(int maxVal): m_maxVal(maxVal) {};
};

【讨论】:

    【解决方案2】:

    从构造函数中删除参数,如下所示:

    IdentifierSequence(): m_maxVal(maxVal) {}
    

    然后它会编译。

    您可以直接访问maxVal,无需将其传递给构造函数。

    如果该值在执行期间从未更改,则您甚至不需要 m_maxVal,具体取决于您的用途。您可以在类中的任何位置使用模板参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多