Ошибка вывода аргумента шаблона - PullRequest
3 голосов
/ 02 октября 2010
template <typename T>
void foo(int i)
{
  //nothing inside
}

int main()
{
   foo(5); //fails
   foo<int>(5); //works
}

Почему foo (5) не работает, а foo (5) работает?

Ответы [ 5 ]

4 голосов
/ 02 октября 2010

Вы возможно хотели написать

template <typename T>
void foo(T i)          // note the type of i
{
  //nothing inside
}

Обновление

Ниже приведен полный код

#include <iostream>
using std::cout;

template <typename T>
void foo( T i ) {
    cout << __PRETTY_FUNCTION__ << " called with " << i << "\n";
}

int main() {
    foo( 5 );
    foo<int>( 7 );
}

и вывод:

void foo(T) [with T = int] called with 5
void foo(T) [with T = int] called with 7
3 голосов
/ 02 октября 2010

Компилятор не знает, что такое T.

0 голосов
/ 02 октября 2010

Обычно у вас будет что-то вроде этого:

template <class T>
void foo(T i) { }

Затем, когда вы передаете int в качестве параметра, компилятор может определить, что T должно быть int.Поскольку ваш код нигде не использует T, компилятору нечего делать, чтобы определить, что это может быть.

0 голосов
/ 02 октября 2010

Почему foo (5) не работает, а foo (5) работает?

Поскольку компилятор не может определить, что такое T [из foo(5)].

Вы можете оставить только аргументы шаблона конца, а не начала или середины:

Например:

template<typename T, typename U> 
void foo(T t) 
{
}
template<typename T, typename U> 
void bar(U u) 
{
}

int main() 
{
    foo<int>(5);      // Error!! Compiler cannot decide what `U` is
    foo<int, int>(5); // Works!!

    bar<int>(5);      // Works!! `U` deduced from `5` (int)
    bar<int, int>(5); // Works!!
}
0 голосов
/ 02 октября 2010

Если вы определяете функцию как функцию шаблона, то вам нужно определить, какой тип вы собираетесь использовать (даже если ваша функция не использует тип шаблона)

Так что вам нужно сообщить компиляторучто такое тип Т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...