std :: copy:operator = not found

时间:2016-08-14 09:05:09

标签: c++ templates c++11 operator-overloading

我在Vector_t的initializer_list构造函数上使用std :: copy时遇到问题。但正如您在FixedPoint_t的声明中所看到的,它具有足够的复制构造和赋值声明。编译器对我有什么签名?或者我在这里遗漏了什么?编译器输出指出FixedPoint_t的operator =可能适合,但它仍未使用。匹配参数列表似乎也存在问题。

我尝试过的: Vector_t适用于整数类型和其他类,因此它必须是FixedPoint_t的一些问题 MSDN页面表示缺少构造函数。但是FixedPoint_t的ctor匹配 FixedPoint_t可以在Vector_t之外分配,但我无法得出结论 我无法使用我制作的int-wrapper重现错误。

编译器:VS编译器(VS 2015)
错误:C2679二进制运算符“=”:没有找到类型为“const math :: FixedPoint_t”的rhs参数的运算符(或者没有足够的转换)

测试代码

#include <FpMath/FpMath.hpp>

using namespace math;

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

    // Vector object construction using an initializer_list
    Vector_t<FixedPoint_t<int, 4096>, 1> vec {
        4096
    };

    // Assignment outisde of Vector_t
    FixedPoint_t<int, 4096> fp1(3 * 4096);
    FixedPoint_t<int, 4096> fp2 = fp1; // works

    return 0;
}

Vector.hpp

#pragma once

#include <array>
#include <cassert>
#include <initializer_list>
#include <algortihm> // std::copy

#include "FixedPoint.hpp"

namespace math {

    template <typename T, size_type size>
    class Vector_t {
    public:

        typedef T value_type;

        Vector_t(std::initializer_list<value_type> li);

    ...

    private:

        std::array<value_type, size> m_values;
    };

    template <typename T, size_type size>
    Vector_t<T, size>::Vector_t(std::initializer_list<value_type> li) : m_values() {

        assert(li.size() <= size);
        std::copy(li.begin(), li.end(), m_values.begin()); // < Error occurs here
    }
}

FixedPoint.hpp

#pragma once

#include <cassert>
#include <limits>

namespace math {

    template <typename T, T denom>
    class FixedPoint_t {
    public:

        typedef T value_type;
        typedef class_type& reference;

        FixedPoint_t();
        FixedPoint_t(const value_type& numerator);
        FixedPoint_t(const reference other);

        inline reference operator=(const reference other);
        inline reference operator=(const value_type& val);
    };
}

1 个答案:

答案 0 :(得分:5)

问题在于:

typedef class_type& reference;
...
FixedPoint_t(const reference other);
...
inline reference operator=(const reference other);

此构造不声明const引用参数。将其更改为

typedef class_type& reference;
typedef const class_type& const_reference;
...
FixedPoint_t(const_reference other);
...
inline reference operator=(const_reference other);