Информация об изменениях

Сообщение Re[11]: Вопрос знатокам от 03.04.2023 22:19

Изменено 03.04.2023 22:25 rg45

Re[11]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

R>>И тем не менее, это определение может существовать где-то в соседней единице трансляции. Если его нет сейчас, то его можно добавить в любой момент.

_>
_>template<class T>void f(T t);
_>template<class T>void g(T t);

_>inline void fi(int x) { f(x); }

_>template<class T>void f(T t) { g(t);}
_>template<> void g(int x) {}
_>

_>Имеется ввиду так?

Примерно так:

// header.h

template<class T> void f(T t);

inline void fi(int x) { f(x); }


// main.cpp
#include header.h

int main()
{
   fi(42);
}


// separate.cpp

// Primary template definition
template<typename T>
void f(T t)
{
   // . . .
}

// Explicit template instantiations
template void f<char>(char);
template void f<short>(short);
template void f<double>(double);

// Explicit specialization for f<int>
template<>
void f<int>(int i)
{
   // . . .
}


Если собрать этот проект по msvc, то будет работать в точности как ты хочешь. Но потом кто-то решает, что нужно перенести определение основного шаблона функции f из separate.cpp в header.h. При этом специализация f<int> остается в separate.cpp и в точке использования в fi по-прежнему не видна. Должно измениться поведение программы после такого перенесения или нет?
Re[11]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:

R>>И тем не менее, это определение может существовать где-то в соседней единице трансляции. Если его нет сейчас, то его можно добавить в любой момент.

_>
_>template<class T>void f(T t);
_>template<class T>void g(T t);

_>inline void fi(int x) { f(x); }

_>template<class T>void f(T t) { g(t);}
_>template<> void g(int x) {}
_>

_>Имеется ввиду так?

Примерно так:

// header.h

template<class T> void f(T t);

inline void fi(int x) { f(x); }


// main.cpp
#include header.h

int main()
{
   fi(42);
}


// separate.cpp

// Primary template definition
template<typename T>
void f(T t)
{
   // . . .
}

// Explicit template instantiations
template void f<char>(char);
template void f<short>(short);
template void f<double>(double);

// Explicit specialization for f<int>
template<>
void f<int>(int i)
{
   // . . .
}


Если собрать этот проект под msvc, то будет работать в точности как ты хочешь. Но потом кто-то решает, что нужно перенести определение основного шаблона функции f из separate.cpp в header.h. При этом специализация f<int> остается в separate.cpp и в точке использования в fi по-прежнему не видна. Должно измениться поведение программы после такого перенесения или нет?