我在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;
}
#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
}
}
#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);
};
}
答案 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);