initializer_list<initializer_list出错<T>>



我想初始化我自己的类,类似于:

vector< Point3f >={{1f,2f,3f},{2f,3f,1f},{2f,2f,2f}};

但是显示了一个错误:

无法将"初始值设定项列表"转换为"std::vector<LB::Point3f,std::分配器<LB::Point3f>>…

我想知道用大括号中的列表初始化我自己的类的正确方法是什么。

这是我的代码:

#pragma once
#ifndef POINT_HPP
#define POINT_HPP
#include<initializer_list>
namespace LB
{
using namespace std;
template< typename T,unsigned length>
class Point
{
T data[length];
public:
Point(){}
Point(const initializer_list<T>& t)
{
int min = t.size() < length ? t.size() : length;
int i = 0;
for (auto& each : t)
{
if (i >= min)
break;
data[i] = each;
i++;
}
}
Point(Point<T, length>& other)
{
for (int i = 0; i < length; i++)
{
data[i] = other[i];
}
}
/*
other operation function
*/
};
using Point2i = Point<int, 2>;
using Point2f = Point<float, 2>;
using Point2d = Point<double, 2>;
using Point3i = Point<int, 3>;
using Point3f = Point<float, 3>;
using Point3d = Point<double, 3>;
using Point4i = Point<int, 4>;
using Point4f = Point<float, 4>;
using Point4d = Point<double, 4>;
}
#endif

基本上它失败了,因为您当前实现的`Point<T、 unsigned>没有工作副本构造函数。

复制构造函数需要采用const Point<T, length>&,因为初始值设定项列表是const,并且它将需要operator[]const版本,因为复制构造函数的参数是对自定义点类的引用,而不是数组。

以下代码:

#include <iostream>
#include<initializer_list>
#include <vector>
namespace LB
{
template< typename T, unsigned length>
class Point
{
T data[length];
public:
Point() {}
Point(const std::initializer_list<T>& t)
{
int min = t.size() < length ? t.size() : length;
int i = 0;
for (auto& each : t)
{
if (i >= min)
break;
data[i] = each;
i++;
}
}
Point(const Point<T, length>& other)
{
for (size_t i = 0; i < length; i++)
{
data[i] = other[i];
}
}
T& operator[](size_t i) {
return data[i];
}

const T& operator[](size_t i) const {
return const_cast<const T&>(
const_cast<Point&>(*this)[i]
);
}
};
using Point3f = Point<float, 3>;
}
int main() {
std::vector<LB::Point3f> vec = { {1.0f,2.0f,3.0f},{2.0f,3.0f,1.0f},{2.0f,2.0f,2.0f} };
std::cout << vec[1][0] << " , " << vec[1][1] << " , " << vec[1][2] << "n";
}

最新更新