C++ 为什么我得到一个对命名空间的引用是不明确的错误?
我有两个模块,我将它们分为两个不同的C++ 为什么我得到一个对命名空间的引用是不明确的错误?,c++,cmake,C++,Cmake,我有两个模块,我将它们分为两个不同的.h和.cpp文件。我希望在同一个名称空间中声明这两个模块,但我收到了错误通过名称查找找到的候选者是“我的名称空间”和错误:对“我的名称空间”的引用不明确。为什么会这样 我在下面列出了我的cmake配置、两个头文件和模块源文件 file( GLOB HEADER_LIST CONFIGURE_DEPENDS "${myproj_SOURCE_DIR}/include/myproj/*.h" ) # Make an aut
.h
和.cpp
文件。我希望在同一个名称空间中声明这两个模块,但我收到了错误通过名称查找找到的候选者是“我的名称空间”
和错误:对“我的名称空间”的引用不明确。为什么会这样
我在下面列出了我的cmake配置、两个头文件和模块源文件
file(
GLOB HEADER_LIST CONFIGURE_DEPENDS
"${myproj_SOURCE_DIR}/include/myproj/*.h"
)
# Make an automatic library - will be static or dynamic based on user setting
add_library(
${CMAKE_PROJECT_NAME}
module_a.cpp
module_b.cpp
${HEADER_LIST}
)
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC ../include)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ./)
# All users of this library will need at least C++17
target_compile_features(${CMAKE_PROJECT_NAME} PUBLIC cxx_std_17)
//模块a.h
namespace my_namespace{/返回值my_Struct_B
在my_namespace
中声明,因此您需要将其限定为:
my_namespace::my_Struct_B my_namespace::do_something(){
返回我的结构{1,{2};
}
错误消息在技术上是正确的,但有点误导
或者(谢谢@Eljay):
名称空间我的名称空间{
我的结构做点什么{
返回我的结构{1,{2};
}
}
返回值My\u Struct\u B
在My\u命名空间中声明,因此您需要将其限定为:
my_namespace::my_Struct_B my_namespace::do_something(){
返回我的结构{1,{2};
}
错误消息在技术上是正确的,但有点误导
或者(谢谢@Eljay):
名称空间我的名称空间{
我的结构做点什么{
返回我的结构{1,{2};
}
}
这些“模块”是指软件子组件,还是指C++20“模块”?它看起来像前者,但如果您尝试使用后者,可能会得到多个不同的名称空间。该错误仅在使用cmake时发生,还是在手动编写编译命令行时发生?请注意,您可能可以通过编写::my_namespace::do_something
@BenVoigt来解决您的问题。抱歉,这只是一个错误软件模块;我使用的是c++17。实际上,我没有在没有CMake的情况下尝试过它,但CMake只是使用常规的编译步骤,所以我认为这无关紧要。在名称空间之前添加全局解析标识符也没有帮助。干净编译(我假设其中一个错误已修复)-这些是“模块”吗在软件子组件的意义上,或在C++20“模块”的意义上?它看起来像前者,但如果您尝试使用后者,可能会得到多个不同的名称空间。该错误仅在使用cmake时发生,还是在手动编写编译命令行时发生?请注意,您可能可以通过编写::my_namespace::do_something
@BenVoigt来解决您的问题。抱歉,这只是一个错误软件模块;我使用的是c++17。实际上,我没有在没有CMake的情况下尝试过它,但CMake只是使用常规编译步骤,所以我认为这无关紧要。在名称空间之前添加全局解析标识符也没有任何帮助。干净编译(我假设其中一个错误已修复)-虽然我自己也是这样做的,但我承认这是在名称空间中进行定义的原因之一,而不是将定义限定到名称空间中。这只是我的一个输入错误;我在返回类型上有解析限定符,错误仍然存在。另一个选项是尾部返回类型:automy_namespace::do_something()->my_Struct_B{…}
在do\u something
的定义中,名称空间在范围内。虽然我自己这样做,但我承认这是在名称空间内进行定义的原因之一,而不是将定义限定在名称空间中。这只是我的一个输入错误;我确实在retur上有分辨率限定符n type,错误仍然存在。另一个选项是尾部返回类型:auto my_namespace::do_something()->my_Struct_B{…}
在do_something
的定义中,命名空间在范围内。