шаблонная специализация на C ++ - PullRequest
4 голосов
/ 10 ноября 2011

Я пытался понять специализации шаблонов. Почему это приводит к ошибке (specialization of 'T foo(T, T) [with T = int]' after instantiation)

template <class T> T foo(T a, T b);

int main()
{
    int x=34, y=54;
    cout<<foo(x, y);
}

template <class T> T foo(T a, T b)
{
    return a+b;
}

template <> int foo<int>(int a, int b)
{
    cout<<"int specialization";
}

Ответы [ 3 ]

8 голосов
/ 10 ноября 2011

Стандарт требует, чтобы все определения шаблонов были известны во время создания экземпляра и чтобы каждая единица перевода видела одно и то же определение. В противном случае ваша программа некорректна (и фактически диагностика не требуется).

(Чтобы решить эту проблему, просто поместите все определения шаблонов вверху программы.)

Помните, что функции шаблонов - это не функции, а шаблоны. Думайте о них как о инструменте генерации кода .

3 голосов
/ 10 ноября 2011

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

Фактически вышеупомянутое правило применяется ко всем функциям шаблона.

Решение:
Переместите специализацию шаблона на foo() перед вашим main().

Следующее должно работать нормально:

template <class T> T foo(T a, T b);

/*Should be visible before instantiation*/
template <> int foo<int>(int a, int b)
{
    cout<<"int specialization";
}

int main()
{
    int x=34, y=54;
    cout<<foo(x, y);
}

template <class T> T foo(T a, T b)
{
    return a+b;
}
0 голосов
/ 11 ноября 2011

Не делай этого.

Что сказал Херб Саттер:

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

См .: http://www.gotw.ca/publications/mill17.htm

...