代码之家  ›  专栏  ›  技术社区  ›  Abhishek Ojha

为什么我的代码接受其他数据类型以及模板中的给定数据类型?[副本]

  •  0
  • Abhishek Ojha  · 技术社区  · 1 年前

    我正在学习这个话题 模板 在C++中,它表示我还可以在模板语法中指定数据类型。但是如果我在类的对象中传递了一个不同的数据类型并调用了类的方法,它应该会抛出一个错误或垃圾输出,但如果我在声明类的对象并调用它的同时分配数据类型,它不会给出正确的输出。为什么会这样?

    这是我正在练习的程序

    #include <iostream>
    using namespace std;
    template <class t1 = int, class t2 = int>
    class Abhi
    {
    public:
        t1 a;
        t2 b;
        Abhi(t1 x, t2 y)
        {
            a = x;
            b = y;**your text**
        }
        void display()
        {
            cout << "the value of a is " << a << endl;
            cout << "the value of b is " << b << endl;
        }
    };
    int main()
    {
        Abhi A(5,'a');
        A.display();
    
        Abhi <float,int>N(5.3,8.88);
        N.display();
    
        return 0;
    }
    

    我正面临第一个对象中的问题 A. 而第二个对象 N 给出正确的输出

    第一个对象的上述程序的输出为 the value of a is 5 the value of b is a

    第二个对象的上述程序的输出为 the value of a is 5.3 the value of b is 8

    1 回复  |  直到 1 年前
        1
  •  1
  •   bitmask    1 年前

    A. char 可以隐式转换为 int .虽然 A 将由C++20推导为 Abhi<int,char> 这就是为什么当你输出它时,你会得到一个 a 而不是其对应的整数表示。

    看见 CTAD 以便更详细地解释该机制。

    更有趣的是为什么编译器隐式转换 double 整数 float 在里面 N 。这表示编译器警告标志不够高,或者您正在积极忽略它们。

        2
  •  -1
  •   Caleth    1 年前

    当你写作时 Abhi A(5,'a'); ,它不使用 Abhi 在这种情况下,模板类型参数是从构造函数参数值中推导出来的 A 是一个 Abhi<int, char> 。这是一个名为 Class Template Argument Deduction .

    如果您编写 Abhi<> A(5, 'a'); .

    当你写作时 Abhi <float,int>N(5.3,8.88); 您已经指定了类型,但C++允许在算术类型之间进行转换。不幸的是,在将小数转换为 int 。通常,编译器会设置警告或禁止这些有损转换。

    char 整数 没有问题,因为 整数 每个的值 烧焦 价值

    我们可以看到 here