Я наблюдаю какое-то странное поведение при попытке создать экземпляр функции шаблона.
Короче говоря, я реализую библиотеку функций шаблона. Для целей этой библиотеки я предполагаю, что для каждого типа 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; }
Итак, у меня есть два (надеюсь, простых) вопроса:
Почему это произошла ошибка?
Есть ли чистый способ изменить мой подход (реализацию шаблона), чтобы включить предполагаемое использование, показанное выше?
Спасибо!