Сообщение Re[11]: Вопрос знатокам от 03.04.2023 22:19
Изменено 03.04.2023 22:25 rg45
Re[11]: Вопрос знатокам
Здравствуйте, kov_serg, Вы писали:
R>>И тем не менее, это определение может существовать где-то в соседней единице трансляции. Если его нет сейчас, то его можно добавить в любой момент.
_>
_>Имеется ввиду так?
Примерно так:
Если собрать этот проект по msvc, то будет работать в точности как ты хочешь. Но потом кто-то решает, что нужно перенести определение основного шаблона функции f из separate.cpp в header.h. При этом специализация f<int> остается в separate.cpp и в точке использования в fi по-прежнему не видна. Должно измениться поведение программы после такого перенесения или нет?
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>>И тем не менее, это определение может существовать где-то в соседней единице трансляции. Если его нет сейчас, то его можно добавить в любой момент.
_>
_>Имеется ввиду так?
Примерно так:
Если собрать этот проект под msvc, то будет работать в точности как ты хочешь. Но потом кто-то решает, что нужно перенести определение основного шаблона функции f из separate.cpp в header.h. При этом специализация f<int> остается в separate.cpp и в точке использования в fi по-прежнему не видна. Должно измениться поведение программы после такого перенесения или нет?
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 по-прежнему не видна. Должно измениться поведение программы после такого перенесения или нет?