当前位置: 首页 > 知识库问答 >
问题:

在类模板中隐藏用户定义转换的参数包构造函数

闾丘成双
2023-03-14
template <unsigned int N, typename T>
class Vec
{
public:

    T m_components[N];

    Vec()
        : m_components{}
    { }

    template<typename ...Args>
    explicit Vec(Args... args)
        : m_components{args...}
    { }

    // ...
}
    // ...

    template <unsigned int _N, typename _T>
    explicit operator Vec<_N, _T> () const
    {
        Vec<_N, _T> vec;
        for(unsigned int i = 0; i < N && i < _N; ++i)
            vec.m_components[i] = static_cast<_T>(m_components[i]);
        return vec;
    }

    // ...
Vec<2, int> a(2, 8);
Vec<4, double> b;
b = (Vec<4, double>)a;
C2440: 'initializing': cannot convert from 'Vec<2, int>' to 'T' // points to the expansion of the parameter pack: m_components{args...}

我可以看到,当我逐步通过代码,C样式的强制转换直接到参数包构造函数。为什么这是,我做错了什么?如何防止参数包构造函数似乎隐藏用户定义的转换?

共有1个答案

荣沈义
2023-03-14

添加此构造函数:

    // ...

    template <unsigned int _N, typename _T>
    explicit Vec(const Vec<_N, _T>& other)
    {
        for(unsigned int i = 0; i < N && i < _N; ++i)
            m_components[i] = static_cast<_T>(other.m_components[i]);
    }

    // ...

正如我所理解的,我可能在这里大错特错了(有更多专业知识的人可以解释得更好),编译器不知道如何修改模板类的当前实例,以便与另一个类一起分配。

在构造过程中,m_components的大小是固定的。即使使用重载强制转换操作符,也只能完成一半的工作。必须有某种机制来修改当前实例,以接受来自另一个实例的数据。

 类似资料:
  • 我正在尝试创建一个。我想直接使用它。e、 g.。但是,当从转换为

  • 我试图构建一个包含getter和setter的构造函数,除了在参数中调用它之外,这些构造函数似乎对我的所有属性都很好。 当我读到这行代码时: 然后在控制台中出现以下错误: 构造函数flip(String)未定义构造函数flip(String)未定义 也许我错过了什么?

  • 考虑下面的代码 在第三个例子中,我知道模板推导不能发生,这就是为什么要显式指定模板参数。但是为什么没有从到

  • 这些代码如下: 使用G++4.8.2错误信息编译:

  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 类似于将JsonNode转换为POJO和将JsonNode转换为java array,但无法找到问题的确切解决方案。 以下是我的POJOs声明: 所以在我的测试中,我想得到一个建筑列表,并将json列表转换/绑定到一个真实对象建筑列表。 以下是我想做的: 但是,我得到以下错误: 显然,如果我在Building类中删除了构造函数,并为字段类型添加了setter,它就会起作用。但是如果我确实有一个要求