C ++类模板构造函数-数组(U *)的重载引用(U&)失败

星状星体

我正在尝试构建一个构造函数,以将数组作为参数,从而使另一个使用标量的参数过载。代码如下。

#include <iostream>

template <typename T>
class SmallVec { // This is a 3 dimensional vector class template
public:
    T data[3] = {0}; // internal data of class
    template <typename U>
    explicit SmallVec(const U& scalar) { // if a scalar, copy it to each element in data
        for(auto &item : data) {
            item = static_cast<T>(scalar);
        }
    }
    template <typename U>
    explicit SmallVec(const U* vec) { // if a vector, copy one by one
        for(auto &item : data) {
            item = static_cast<T>(*vec); 
            vec++;
        }
    }
};

int main() {
    float num = 1.2;
    float *arr = new float[3];
    arr[2] = 3.4;
    SmallVec<float> vec1(num); // take num, which works fine
    SmallVec<float> vec2(arr); // !!!--- error happens this line ---!!!
    std::cout << vec1.data[2] << " "  << vec2.data[2] << std::endl;
    return 0;
}

编译器抱怨

error: invalid static_cast from type 'float* const' to type 'float'

显然,vec2(arr)仍然调用第一个构造函数。但是,如果我删除template <typename U>并替换UT该程序运行正常。我该怎么做才能纠正这个问题?

任何建议表示赞赏!

克里斯蒂安·哈克(Christian Hackl)

我正在尝试构建一个构造函数以将数组作为参数

(...)

explicit SmallVec(const U* vec) { // if a vector, copy one by one

您不采用数组。您使用了一个指针,该指针可能指向也可能不指向数组,即使它指向一个数组,谁会说该数组至少包含三个元素?这是一个严重的设计缺陷。

C ++确实允许您通过引用或const引用获取原始数组,即使语法很糟糕:

explicit SmallVec(const U (&vec)[3]) {

构造函数的实现也不同:

    for(int index = 0; index < 3; ++index) {
        data[index] = static_cast<T>(vec[index]); 
    }

看着main,不过,问题更大。您用于new[]动态分配数组。那已经是一个非常糟糕的主意了。巧合的是,您的示例也缺少delete[]为什么不使用局部数组呢?

 float arr[3];

这将使您的程序编译并可能正确运行,但是由于您仅将数组的第3个元素设置为有效值,因此代码中仍然存在未定义的行为。其他两个元素保持未初始化状态,并且float即使复制就从未初始化的读取,也会导致未定义的行为。

所以最好做到:

 float arr[3] = { 0.0, 0.0, 3.4 };

除此之外,C ++ 11还邀请您使用std::array,这通常会使事情更安全,并改善了语法。这是一个完整的示例:

#include <iostream>
#include <array>

template <typename T>
class SmallVec { // This is a 3 dimensional vector class template
public:
    std::array<T, 3> data; // internal data of class
    template <typename U>
    explicit SmallVec(const U& scalar) { // if a scalar, copy it to each element in data
        for(auto &item : data) {
            item = static_cast<T>(scalar);
        }
    }
    template <typename U>
    explicit SmallVec(std::array<U, 3> const& vec) { // if a vector, copy one by one
        for(int index = 0; index < 3; ++index) {
            data[index] = static_cast<T>(vec[index]); 
        }
    }
};

int main() {
    float num = 1.2;
    std::array<float, 3> arr = { 0.0, 0.0, 3.4 };
    SmallVec<float> vec1(num);
    SmallVec<float> vec2(arr);
    std::cout << vec1.data[2] << " "  << vec2.data[2] << std::endl;
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中使用通用引用参数为模板类编写构造函数

来自分类Dev

将C数组分配给C ++的std :: array吗?(std :: array <T,U> = T [U])-从“ T [U]”到“ std :: array <T,U>”不存在合适的构造函数

来自分类Dev

模板类的专业化(数组作为构造函数的输入)?

来自分类Dev

类模板构造函数重载解析度歧义

来自分类Dev

从C ++中的私有模板类继承构造函数

来自分类Dev

具有参数副本构造函数的C ++模板类

来自分类Dev

C ++类模板复制构造函数返回类型

来自分类Dev

在C ++中访问模板类的私有构造函数

来自分类Dev

c ++模板类根据类型通过ref传递构造函数

来自分类Dev

C ++模板类“没有合适的默认构造函数”

来自分类Dev

C ++类模板复制构造函数返回类型

来自分类Dev

C++在构造函数中选择类成员的模板类型

来自分类Dev

c ++模板为特定类型的类调用特定的构造函数

来自分类Dev

c ++初始化模板类构造函数

来自分类Dev

模板函数C ++,它接受参数U并返回T

来自分类Dev

深度复制构造函数数组类C ++

来自分类Dev

自己类的类似于C#数组的构造函数

来自分类Dev

新的类型/类和朋友的C ++重载构造函数

来自分类Dev

C#在构造函数中传递对类的引用

来自分类Dev

C ++类模板对函数的未定义引用

来自分类Dev

C ++模板函数的重载

来自分类Dev

模板函数重载C ++

来自分类Dev

c ++ 11:通过std :: function <T(const U&)>进行泛型类型推送

来自分类Dev

C ++标准是否允许非模板类使用模板构造函数?

来自分类Dev

C++显式实例化非模板类的模板构造函数

来自分类Dev

具有构造函数参数的C#新类,该构造函数引用正在创建该类的类

来自分类Dev

通过引用数组传递给C ++中的模板函数

来自分类Dev

如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

来自分类Dev

从可变参数模板数组引用构造函数初始化双嵌套std :: array

Related 相关文章

  1. 1

    如何在C ++中使用通用引用参数为模板类编写构造函数

  2. 2

    将C数组分配给C ++的std :: array吗?(std :: array <T,U> = T [U])-从“ T [U]”到“ std :: array <T,U>”不存在合适的构造函数

  3. 3

    模板类的专业化(数组作为构造函数的输入)?

  4. 4

    类模板构造函数重载解析度歧义

  5. 5

    从C ++中的私有模板类继承构造函数

  6. 6

    具有参数副本构造函数的C ++模板类

  7. 7

    C ++类模板复制构造函数返回类型

  8. 8

    在C ++中访问模板类的私有构造函数

  9. 9

    c ++模板类根据类型通过ref传递构造函数

  10. 10

    C ++模板类“没有合适的默认构造函数”

  11. 11

    C ++类模板复制构造函数返回类型

  12. 12

    C++在构造函数中选择类成员的模板类型

  13. 13

    c ++模板为特定类型的类调用特定的构造函数

  14. 14

    c ++初始化模板类构造函数

  15. 15

    模板函数C ++,它接受参数U并返回T

  16. 16

    深度复制构造函数数组类C ++

  17. 17

    自己类的类似于C#数组的构造函数

  18. 18

    新的类型/类和朋友的C ++重载构造函数

  19. 19

    C#在构造函数中传递对类的引用

  20. 20

    C ++类模板对函数的未定义引用

  21. 21

    C ++模板函数的重载

  22. 22

    模板函数重载C ++

  23. 23

    c ++ 11:通过std :: function <T(const U&)>进行泛型类型推送

  24. 24

    C ++标准是否允许非模板类使用模板构造函数?

  25. 25

    C++显式实例化非模板类的模板构造函数

  26. 26

    具有构造函数参数的C#新类,该构造函数引用正在创建该类的类

  27. 27

    通过引用数组传递给C ++中的模板函数

  28. 28

    如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

  29. 29

    从可变参数模板数组引用构造函数初始化双嵌套std :: array

热门标签

归档