【问题标题】:Class Templates: Order of Construction类模板:构造顺序
【发布时间】:2014-07-19 07:59:48
【问题描述】:
template < class T1, class T2 >
class A
{
    T1 x;
    T2 y;

  public:
    A(T1 a, T2 b)
    {
        x = a;
        y = b;
        cout << x << " " << y << endl;
    }

    A(T2 b, T1 a)
    {
        x = a;      
        y = b;      
        cout << x << " " << y << endl;
    } 
};

int main()
{
    A<int, float> obj1(1, 2.5);
    A<float, int> obj2(1, 2.5);

    return 0;
}

我明白为什么obj1调用了第一个构造函数,但是为什么obj2实例化时调用了第二个构造函数?

【问题讨论】:

    标签: c++ templates constructor


    【解决方案1】:

    因为T1T2分别是floatint,所以构造函数看起来像

       A (float a, int b ) // first
    
       A (int a, float b ) // second
    

    构造函数参数分别为intdouble。第二个构造函数提供了比第一个更好的匹配。

    【讨论】:

    • 你是如何推断出 T1 是 float 而 T2 是 int 的?他们不是相反吗?
    • @DMehta 不,他们不是,因为你这样说:A &lt; float, int &gt; obj2
    • 正是我的观点。在第二个构造函数中,第一个参数是 T2 类型,第二个是 T1 类型。我是不是哪里错了?
    • @DMehta 是的,你传递了intdouble,所以第二个构造函数是更好的匹配。但这就是我在答案中所说的。
    • 非常感谢,但由于某种原因,我无法理解这一点。有没有可以参考的文献?
    【解决方案2】:

    创建类A的对象obj1时,实例化:

    A < int, float > obj1 ( 1, 2.5 ) 
    

    告诉编译器T1 应该被视为intT2 应该被视为float。因此,该对象将两个构造函数视为:

    A ( int a, float b ) // first
    
    A ( float a, int b ) //second
    

    传递给obj1 的初始值为(int) 1 和(double) 2.5,由于构造函数1 似乎更匹配,所以它被执行。

    现在当对象 obj2 被创建时,实例化:

    A < float, int > obj1 ( 1, 2.5 ) 
    

    告诉编译器T1 应该被视为floatT2 应该被视为int。因此,该对象将两个构造函数视为:

    A ( float a, int b ) // first
    
    A ( int a, float b ) //second
    

    传递给obj1 的初始值为(int) 1 和(double) 2.5,由于构造函数2 似乎更匹配,所以它被执行。

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      相关资源
      最近更新 更多