Создание экземпляров шаблона в GCC отличается от Visual C ++ - PullRequest
2 голосов
/ 05 марта 2019

У меня проблемы с переносом кода, который отлично работает в Windows в Visual Studio 2017 C ++ для работы в Linux с GCC 8.2.

#include <stdio.h>

class A
{
public:
    int value;
};

template<typename T> int GetValue(T value);

template<typename T> int GetValue(A value)
{
    return value.value;
}

template int GetValue<A>(A value);

int main(int argc, char **argv)
{
    A valueHolder;
    valueHolder.value = 42;

    int value = GetValue(valueHolder);
    printf("hello %d!", value);

    return 0;
}

Он компилируется и работает с правильным выводом в Windows, но в Linux я получаю ошибку компиляции с Неопределенная ссылка на 'int GetValue (A)' при использовании GetValue в основной функции.

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

Как мне заставить этот тип создания экземпляров шаблона работать с GCC?

1 Ответ

2 голосов
/ 05 марта 2019

При определении специализации необходимо удалить параметры типа ... изменить код с

template<typename T> int GetValue(A value)
{
    return value.value;
}

до

template<> int GetValue(A value)
{
    return value.value;
}

И все будет работать как положено

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