问题涉及到一堆文件,所以我会尽力总结。
1 - 'traits/logger.h' 定义了
concept
就像(很快):
namespace tenacitas::lib::traits {
template <typename t>
concept logger = requires(t p_t) {
{
p_t.deb(std::declval<std::string_view>(),
std::declval<std::source_location>() =
std::source_location::current())
} -> std::same_as<void>;
...
};
}
2 - 'log/internal/logger.h' 定义日志记录的基类,它符合上面的
concept
,在tenacitas::lib::log::internal
内部。
3 - 在“log/cerr.h”中,我们有:
namespace tenacitas::lib::log {
using cerr = tenacitas::lib::log::internal::logger<decltype(
[](std::string_view s) { std::cerr << s; })>;
}
4 - 在“container/circular_queue.h”中有:
namespace tenacitas::lib::container {
template <typename t>
concept circular_queue_supplier = requires(t p_t) {
typename t::logger;
tenacitas::lib::traits::logger<typename t::logger>;
{ p_t.get_logger() } -> std::same_as<typename t::logger &>;
};
template <typename t_data, circular_queue_supplier t_circular_queue_supplier>
requires std::move_constructible<t_data> && std::copy_constructible<t_data>
struct circular_queue {
using data = t_data;
using logger = typename t_circular_queue_supplier::logger;
...
private:
logger &m_logger;
...
};
}
5 - 在“test/container/circular_queue.h”中我写道:
struct supplier {
using logger = tenacitas::lib::log::cerr;
logger &get_logger() { return m_log; };
private:
logger m_log;
};
bool test(){
supplier _supplier;
container::circular_queue<std::string, supplier> queue(_supplier);
...
}
6 - 在
main.cpp
中,我调用上面的 test
函数。
当我尝试使用
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
进行构建时,我得到:
‘supplier’ has a field ‘supplier::m_log’ whose type uses the anonymous namespace [-Werror=subobject-linkage]
还有
‘tenacitas::lib::container::circular_queue<std::__cxx11::basic_string<char>, supplier>’ has a field ‘tenacitas::lib::container::circular_queue<std::__cxx11::basic_string<char>, supplier>::m_log’ whose type uses the anonymous namespace [-Werror=subobject-linkage]
我尝试了很多事情,但没有结果。
有什么想法吗?
正如 @IgorTandetnik 所发布的,更正是使用类似以下内容:
namespace tenacitas::lib::log {
struct cerr_writer {
void operator()(std::string_view p_str) { std::cerr << p_str; }
};
using cerr = tenacitas::lib::log::internal::logger<cerr_writer>;
} // namespace tenacitas::lib::log