lundi 15 novembre 2021

Why does 'extern template class' technique not work as expected?

The original question has been refined.

Given a source code file named main.cpp as follows:

#include <string>
extern template class std::basic_string<char>;

template<typename T>
struct A
{
    T n = {};

    T get() const
    {
        return n;
    }
};

extern template struct A<int>;

int main()
{
    auto a = A<int>{}.get(); // undefined reference to `A<int>::get() const'
    auto b = static_cast<int>(std::string{}.size()); // ok

    return a + b;
}

What I expected:

Note that the source code has extern template class std::basic_string<char> but no template class std::basic_string<char>.

So, the compiler would not instantiate class std::basic_string<char>, then g++ main.cpp would cause link errors on line std::string{}.size() as on line A<int>{}.get().

What I observed:

It is ok to g++ main.cpp on line std::string{}.size(). Online demo

Why does extern template class technique not work as expected?

Aucun commentaire:

Enregistrer un commentaire