Неявные параметры шаблона - PullRequest
       10

Неявные параметры шаблона

13 голосов
/ 09 февраля 2011

Следующий код генерирует ошибку компиляции в Xcode:

template <typename T>
struct Foo
{
    Foo(T Value)
    {
    }
};

int main()
{
    Foo MyFoo(123);
    return 0;
}

error: missing template arguments before 'MyFoo'

Изменение Foo MyFoo(123); на Foo<int> MyFoo(123); устраняет проблему, но не должен ли компилятор определить подходящий тип данных?

Это ошибка компилятора или я неправильно понимаю параметры шаблона?

Ответы [ 7 ]

11 голосов
/ 09 февраля 2011

Конструктор может теоретически вывести тип объекта, который он строит, но утверждение:

Foo MyFoo(123);

Распределяет временное пространство для MyFoo и должен знать полный тип MyFoo, чтобы узнать, сколько места требуется.

Если вы хотите избежать ввода (то есть пальцами) названия особенно сложного шаблона, попробуйте использовать typedef:

typedef std::map<int, std::string> StringMap;

Или в C ++ 0x вы можете использовать ключевое слово auto, чтобы компилятор использовал вывод типа - хотя многие будут утверждать, что это приводит к менее читаемому и более подверженному ошибкам коду, в том числе и я сам. ; Р

8 голосов
/ 09 февраля 2011

компилятор может определить тип параметра шаблона только для шаблонных функций, но не для классов / структур

2 голосов
/ 21 февраля 2015

В C ++ 11 вы можете использовать decltype:

int myint = 123;
Foo<decltype(myint)> MyFoo(myint);
2 голосов
/ 09 февраля 2011

Компилятор может вывести аргумент шаблона в следующем случае:

template<typename T>
void fun(T param)
{
    //code...
}

fun(100);    //T is deduced as int;
fun(100.0);  //T is deduced as double
fun(100.0f); //T is deduced as float

Foo<int> foo(100);
fun(foo);    //T is deduced as Foo<int>;

Foo<char> bar('A');
fun(bar);    //T is deduced as Foo<char>;

На самом деле вывод аргументов шаблона - огромная тема. Прочитайте эту статью в ACCU:

Вывод аргумента шаблона C ++

2 голосов
/ 09 февраля 2011

Это не ошибка, это несуществующая функция.Вы должны полностью указать аргументы шаблона класса / структуры во время создания экземпляра, всегда, типы не выводятся, как они могут быть для шаблонов функций.

1 голос
/ 08 июня 2019

То, что вы пытаетесь сделать, теперь работает в C ++ 17. Параметры шаблона могут быть выведены в C ++ 17.

template <typename T>
struct Foo
{
    Foo(T Value)
    {
    }
};

int main()
{
    Foo a(123);
    Foo b = 123;
    Foo c {123};
    return 0;
}
0 голосов
/ 09 февраля 2011

В этом есть большой смысл, так как Foo не класс, только Foo<T>, где T - тип.

В C ++ 0x вы можете использовать auto, и вы можете создать функцию, которая сделает вас Foo, давайте назовем его foo (нижний регистр f). Тогда вы бы сделали

template<typename T> Foo<T> foo(int x)
{
  return Foo<T>(x);
}

auto myFoo = foo(55);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...