Почему бы не определить параметр шаблона из конструктора? - PullRequest
98 голосов
/ 12 июня 2009

Мой вопрос сегодня довольно прост: почему компилятор не может вывести параметры шаблона из конструкторов классов, в отличие от параметров функции? Например, почему следующий код не может быть действительным:

template<typename obj>
class Variable {
      obj data;
      public: Variable(obj d)
              {
                   data = d;
              }
};

int main()
{
    int num = 2;
    Variable var(num); //would be equivalent to Variable<int> var(num),
    return 0;          //but actually a compile error
}

Как я уже сказал, я понимаю, что это неверно, поэтому мой вопрос почему не так ли? Позволит ли это создать какие-либо серьезные синтаксические дыры? Есть ли случай, когда никто не хотел бы эту функциональность (где вывод типа может вызвать проблемы)? Я просто пытаюсь понять логику, позволяющую сделать вывод из шаблона для функций, но не для классов, сконструированных надлежащим образом.

Ответы [ 12 ]

0 голосов
/ 12 июня 2009

Создание ctor шаблона в качестве переменной может иметь только одну форму , но различные ctors:

class Variable {
      obj data; // let the compiler guess
      public:
      template<typename obj>
      Variable(obj d)
       {
           data = d;
       }
};

int main()
{
    int num = 2;
    Variable var(num);  // Variable::data int?

    float num2 = 2.0f;
    Variable var2(num2);  // Variable::data float?
    return 0;         
}

См? Мы не можем иметь несколько членов Variable :: data.

0 голосов
/ 12 июня 2009

Вы правы, что компилятор может легко догадаться, но это не входит в стандарт или C ++ 0x, насколько мне известно, поэтому вам придется подождать еще как минимум 10 лет (фиксированная скорость оборота стандартов ISO), прежде чем поставщики компиляторов добавить эту функцию

...