【问题标题】:Metaprogramming sample from Wikipedia来自维基百科的元编程示例
【发布时间】:2014-10-13 08:50:29
【问题描述】:

试图理解来自wikipedia的样本

template <int length>
Vector<length>& Vector<length>::operator+=(const Vector<length>& rhs) 
{
    for (int i = 0; i < length; ++i)
        value[i] += rhs.value[i];
    return *this;
}

template <>
Vector<2>& Vector<2>::operator+=(const Vector<2>& rhs) 
{
    value[0] += rhs.value[0];
    value[1] += rhs.value[1];
    return *this;
}

首先我根本无法编译它。我收到错误语法错误:missing ';' before '&lt;'

第二个问题是如何使用它? 据我了解模板名称Vectorstd::vector 不同。

【问题讨论】:

  • 这只是Vector 类的一部分。它不能单独编译。你还需要调用代码来测试它。

标签: c++ metaprogramming template-meta-programming


【解决方案1】:

这只是 Vector 类的(一小部分),展示了一个用于教学目的的概念。

它不能单独编译。您必须编写课程的其余部分。

然后你必须编写调用代码来实例化模板并调用操作符来测试它。然后对其进行调试(或添加跟踪消息)以显示正确的重载已解决。

另请注意,它说“可能会生成以下代码”。您实际上并不需要第二个代码。它只是显示优化器编译器可以对您的代码做什么。

【讨论】:

    【解决方案2】:

    尝试像这样定义类:

    template <int length>
    class Vector
    {
        Vector<length>& operator+=(const Vector<length>& rhs);
        Vector<2>& operator+=(const Vector<2>& rhs);
    };
    

    我会推荐一个在线 C++ 教程

    【讨论】:

    • 我的第一个答案,这是一个很好且有效的答案,我不理解投票失败,如果我错了,我会理解。
    • (不是我的投票)&lt;2&gt; 位没有做你认为它应该做的事情,也与维基百科的例子无关。
    • 对,但是 1)它是正确的 2)它与代码匹配。
    • 不,你定义了template &lt;int len&gt; Vector&lt;2&gt;&amp; Vector&lt;len&gt;::operator+=(const Vector&lt;2&gt;&amp; rhs) - 注意不一致的模板参数。特别是,return *this 不适用于 len!=2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2021-08-13
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多