Разрешение функции, используемой в шаблонной функции namespace-d - PullRequest
0 голосов
/ 19 апреля 2020

Я наблюдаю какое-то странное поведение при попытке создать экземпляр функции шаблона.

Короче говоря, я реализую библиотеку функций шаблона. Для целей этой библиотеки я предполагаю, что для каждого типа T, используемого для создания экземпляра одного из этих шаблонов, пользователь этой библиотеки реализовал функцию с определенной c сигнатурой, скажем:

void foo(const T& t)

Я бы хотел определить функции шаблона моей библиотеки во включающем пространстве имен, скажем, А. Аналогично, я хотел бы, чтобы эти функции могли использоваться в другом (определяемом пользователем) пространстве имен, скажем, B. Общая схема использования, которую я имею в виду, следующее:

    #include <string>
    #include <iostream>

    // My library function
    namespace A {

    template <typename T>
    void my_library_function(const T& t) { foo(t); }

    }


    // Intended usage
    namespace B {

    // User writes a function foo(T) for the specific type T they want 
    // to use in conjunction with my_library_function()
    void foo(const std::string&  s) { std::cout << s << std::endl; }

    // User can then use my_library_function() in their own code
    void super_cool_user_function(const std::string& s) { A::my_library_function<std::string>(s); }
    }

    int main()
    {
        std::string s = "Hello world!";
        B::super_cool_user_function(s);
    }

Я ожидал бы, что это сработает, поскольку в этом коде my_library_function() используется только в том же пространстве имен B, где определено foo(std::string& s). Однако, пытаясь скомпилировать это, я получаю следующую ошибку:

> In instantiation of ‘void A::my_library_function(const T&) [with T =std::__cxx11::basic_string<char>]’:
>
> example.cpp:8:43: error: ‘foo’ was not declared in this scope
>
> void my_library_function(const T& t) { foo(t); }
>
>example.cpp:8:43: note: suggested alternative:
>
>example.cpp:17:6: note:   ‘B::foo’
>
>void foo(const std::string&  s) { std::cout << s << std::endl; }

Итак, у меня есть два (надеюсь, простых) вопроса:

  • Почему это произошла ошибка?

  • Есть ли чистый способ изменить мой подход (реализацию шаблона), чтобы включить предполагаемое использование, показанное выше?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...