Объявить в глобальном пространстве имен при определении метода в некотором пространстве имен? - PullRequest
0 голосов
/ 17 февраля 2019

Мой код содержит две части - шаблон класса 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 с, если это возможно.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Просто объявите вашу функцию frobnicate как шаблон перед пространством имен.

template <class T>
void frobnicate(T&);

namespace my {

template <class T>
struct test
{
    void do_stuff(T& i)
    {
        frobnicate(i);
        // more code here
    }
};
}  // close my namespace
0 голосов
/ 17 февраля 2019

Я думаю, вы можете просто объявить frobnicate в отдельном файле и включить его перед созданием пространства имен my. Или вы можете объявить функцию как макрос с #define в том же файле.Затем вы можете вызвать frobnicate в do_stuff in my.

В противном случае вы не можете вызвать неопределенную функцию.

...