Как специализировать шаблонные функции не шаблонных классов? - PullRequest
5 голосов
/ 16 июля 2010

предположим, у меня есть файл alpha.h:

class Alpha {
public:
    template<typename T> void foo();
};

template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}

Если я включу alpha.h в несколько файлов cpp и скомпилирую с GCC 4.4, он будет жаловаться, что существует несколько определений foo<int> иfoo<float> для нескольких объектных файлов.Это имеет смысл для меня, поэтому я изменяю последние две строки на:

template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}

Но тогда GCC говорит:

явная специализация шаблона не может иметь класс хранения

хорошо ... так как я должен делать это правильно?Я беспокоюсь, что C ++ не позволяет в первую очередь то, что я пытаюсь сделать, и в таком случае есть ли хорошая идиома, которая будет выполнять то же самое?

Ответы [ 4 ]

10 голосов
/ 16 июля 2010

используйте встроенное ключевое слово

template<> inline void Alpha::foo<int>() {}

или предоставьте реализацию в отдельном файле cpp

6 голосов
/ 16 июля 2010

Вы можете пересылать объявления, а также встроенный параметр:

// .h
template<> void Alpha::foo<int>();

//.cpp
template<> void Alpha::foo<int>() {}
4 голосов
/ 16 июля 2010

С точки зрения ODR, полностью (явно) специализированный шаблон больше не является шаблоном, поэтому он подчиняется тем же принципам ODR, что и объект без шаблона того же вида. (Я полагаю, что есть некоторые исключения из этого правила, но оно достаточно для наших целей).

В вашем случае для целей ODR полностью специализированный шаблон функции - это обычная функция. Таким образом, в качестве обычной функции она должна быть объявлена ​​ в заголовочном файле и определена в одном и только одном файле реализации.

0 голосов
/ 05 января 2016

Не требуется отдельная декларация или встроенная клавиатура. ПФ под рабочим кодом.

#include<iostream>

class temp
{
public:
    template <class T>
    T add1(T a, T b)
    {
            return (a + b);
    }
};

template<>
std::string temp::add1<std::string>(std::string aa, std::string bb)
{
    return aa+bb;
}

int main()
{
    temp *tc = new temp();
    std::cout << tc->add1<float>(5.7, 4.5) << std::endl;
    std::cout << tc->add1<std::string>("my ","program") << std::endl;
}

вывод:

10,2

моя программа

...