C++“类型使用匿名命名空间”

问题描述 投票:0回答:1

问题涉及到一堆文件,所以我会尽力总结。

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]

我尝试了很多事情,但没有结果。

有什么想法吗?

c++ namespaces c++-concepts c++-templates
1个回答
0
投票

正如 @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
© www.soinside.com 2019 - 2024. All rights reserved.