首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >initializer_list<initializer_list<T>>错误

initializer_list<initializer_list<T>>错误
EN

Stack Overflow用户
提问于 2021-12-04 17:58:05
回答 1查看 114关注 0票数 1

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

代码语言:javascript
复制
vector< Point3f >={{1f,2f,3f},{2f,3f,1f},{2f,2f,2f}};

但有一个错误显示:

不能将“初始化程序列表”转换为“std::vector>.

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

这是我的密码:

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-04 20:31:12

基本上,它是失败的,因为您当前的`Point没有一个工作的副本构造函数。

由于初始化程序列表是const,所以复制构造函数需要一个const Point<T, length>&,并且考虑到您当前的复制实现,它将需要一个const版本的operator[],因为复制构造函数的参数是对自定义点类的引用,而不是数组。

代码如下:

代码语言:javascript
复制
#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";
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70228120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档