Предоставление специализированных шаблонных функций constexpr в библиотеке - PullRequest
0 голосов
/ 01 марта 2019

У меня есть класс с шаблонными функциями.Одной из них является функция constexpr .Я хочу скомпилировать этот класс как библиотеку и использовать специализированные шаблонные функции от других клиентов.Пример:

//in myclass.h
struct myclass{
template<typename Entity>
static constexpr const char* myfnc1();

template<typename Entity>
static std::string myfnc2();
};

//in myclass.cpp
template<> const char* myclass::myfnc1<AnotherClass>() {return "str";}
template<> std::string myclass::myfnc2<AnotherClass2>() {return "str2"; }

template const char* myclass::myfnc1<AnotherClass>();
template std::string myclass::myfnc2<AnotherClass2>();

Когда я пытаюсь использовать myfnc1<AnotherClass> в другой библиотеке, она говорит, что она не определена, но я могу использовать myfnc2<AnotherClass2>.Когда я проверяю libmyclass.so с nm, я вижу, что шаблон myfnc2 создан с AnotherClass2, а myfnc1 - нет.Я понимаю, что это причина, но интересно, есть ли способ заставить код работать так, как он есть?

Я использую g ++ версии 4.4.2.

1 Ответ

0 голосов
/ 01 марта 2019

если я изменю:

template std::string myclass::myfnc2<AnotherClass2>() {return "str2"; }

на

template<> std::string myclass::myfnc2<AnotherClass2>() {return "str2"; }

Я могу скомпилировать.Опечатка?

> g++ -fPIC -shared x.cpp -O3 -o x.so
> nm x.so | c++filt | grep fnc

приводит к:

0000000000000680 T char const* myclass::myfnc1<AnotherClass>()
0000000000000690 T std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > myclass::myfnc2<AnotherClass2>()

Я не знаю, удалось ли вам действительно скомпилировать ошибку в коде.Но я могу скомпилировать это с изменениями и получить результаты, как и ожидалось.Но я использую g++ (GCC) 8.2.1.

...