Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我得到一个对命名空间的引用是不明确的错误?_C++_Cmake - Fatal编程技术网

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
的定义中,命名空间在范围内。