重载类模板的非成员算术

时间:2018-03-12 21:30:14

标签: c++ templates operator-overloading

我正在尝试重载operator *来处理用不同类型实例化的类模板,但是我得到了一个"太多的模板参数列表"来自编译器。这是我的功能实现:

template <typename T>
template <typename E>
inline Vec2<T> operator*(Vec2<T> lhs, Vec2<E>& rhs)
{
   lhs *= rhs;
   return lhs;
}

template <typename T>
template <typename E>
inline Vec2<T> operator*(Vec2<T> lhs, E scalar)
{
    lhs.x *= scalar;
    lhs.y *= scalar;
    return lhs;
}

以下是我用它的用例:

Vec2<float> scale(0.5, 0.8);
Vec2<short> value(50, 100);

Vec2<short> result = value * scale;
// value should now equal (25, 80)

1 个答案:

答案 0 :(得分:1)

嗯,您使用的语法不正确。

template <typename T, typename E> Vec2<T> operator*(Vec2<T> lhs, Vec2<E>& rhs)

仅在定义模板类的模板成员时使用,而不是您的情况。在您的情况下,您应该只使用

function add_nofollow_acf($field) {
    $field = preg_replace_callback(
        '/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
    function($m) {
        if (strpos($m[1], "md7.info") === false)
        return '<a href="'.$m[1].'" rel="nofollow noopener noreferrer" target="_blank">'.$m[2].'</a>';
        else
        return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
    },
    $field);
        return $field;
    }
add_filter('acf/load_value', 'add_nofollow_acf');