Мой код содержит две части - шаблон класса test
внутри пространства имен my
и функцию frobnicate
в глобальном пространстве имен.Шаблон класса хочет использовать эту функцию в одном из своих методов, и я хочу объявить ее рядом с ее использованием:
namespace my
{
template <class T>
struct test
{
void do_stuff(T& i)
{
void frobnicate(T&);
frobnicate(i);
// more code here
}
};
}
struct SomeClass {};
void frobnicate(SomeClass& i)
{
// some code here
}
int main()
{
my::test<SomeClass> t;
SomeClass object;
t.do_stuff(object);
}
Это работает в MS Visual Studio 2017 из-за ошибки (описанной здесь ), поскольку Visual Studio объявляет функцию в глобальном пространстве имен, в то время как согласно Стандарту такое объявление объявляет функцию в текущем пространстве имен.
Однако gcc по праву жалуется:
... неопределенная ссылка на `my :: frobnicate (SomeClass &) '
Можно ли заставить его работать в gcc или любом другом стандартном компиляторе?
Если я поставлю объявление frobnicate
перед объявлением шаблона test
, код работает.Однако в моем реальном коде эти две части кода находятся в несвязанных заголовочных файлах, и я хочу, чтобы мой код работал независимо от порядка #include
с, если это возможно.