C++ 当使用静态constexpr成员构造时,为什么std::make_与new共享不同?

C++ 当使用静态constexpr成员构造时,为什么std::make_与new共享不同?,c++,c++11,constexpr,make-shared,C++,C++11,Constexpr,Make Shared,当我使用new初始化共享\u ptr时,它是正常的。但是当我使用make\u shared时,链接错误发生 当使用静态constexpr成员构造时,为什么std::make_与new共享不同 我的环境是macOS with Clion,CMakeList.txt是: /Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/everettjf/code/cpptest/cmake-build-debug --targe

当我使用new初始化共享\u ptr时,它是正常的。但是当我使用make\u shared时,链接错误发生

当使用静态constexpr成员构造时,为什么std::make_与new共享不同

我的环境是macOS with Clion,CMakeList.txt是:

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/everettjf/code/cpptest/cmake-build-debug --target all -- -j 8
Scanning dependencies of target cpptest
[ 50%] Building CXX object CMakeFiles/cpptest.dir/main.cpp.o
[100%] Linking CXX executable cpptest
Undefined symbols for architecture x86_64:
  "Node::data_size", referenced from:
      Header::foo() in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [cpptest] Error 1
make[1]: *** [CMakeFiles/cpptest.dir/all] Error 2
make: *** [all] Error 2
为什么新技术在起作用

cmake_minimum_required(VERSION 3.6)
project(cpptest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(cpptest ${SOURCE_FILES})
std::shared_ptr v(新视图(数据大小));
在上面的代码中(我猜是),编译器用值本身替换数据大小。因此,它编译和运行良好

为什么std::make_shared()失败

std::shared\u ptr v=std::make\u shared(数据大小);
std::make_shared做了一件叫做完美转发的事情。在上述情况下,它需要知道Node::data\u size的地址。因为您没有在任何地方定义它,所以链接器找不到符号并抛出错误

要解决此问题,请在代码中定义符号Node::data\u size。

为什么“新建”起作用

cmake_minimum_required(VERSION 3.6)
project(cpptest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(cpptest ${SOURCE_FILES})
std::shared_ptr v(新视图(数据大小));
在上面的代码中(我猜是),编译器用值本身替换数据大小。因此,它编译和运行良好

为什么std::make_shared()失败

std::shared\u ptr v=std::make\u shared(数据大小);
std::make_shared做了一件叫做完美转发的事情。在上述情况下,它需要知道Node::data\u size的地址。因为您没有在任何地方定义它,所以链接器找不到符号并抛出错误


要解决这个问题,请在代码中定义symbol Node::data\u size。

foo函数调用没有给出错误,我只是检查了一下哦,没有。为什么?我刚刚用Xcode创建了一个新项目。(macOS>命令行工具)。然后将代码粘贴到main.cpp中。然后构建,就会发生错误@KapilSee@cpplearner谢谢,这几乎是同一个问题。在Xcode中,错误可以通过静态_转换修复,如下代码:
std::make_shared(静态_转换(数据大小))@Kapil请看这里,如果我选择c++11或c++14,则会发生错误。如果我选择c++1z,没有错误。foo函数调用没有给出错误,我只是检查了哦,没有。为什么?我刚刚用Xcode创建了一个新项目。(macOS>命令行工具)。然后将代码粘贴到main.cpp中。然后构建,就会发生错误@KapilSee@cpplearner谢谢,这几乎是同一个问题。在Xcode中,错误可以通过静态_转换修复,如下代码:
std::make_shared(静态_转换(数据大小))@Kapil请看这里,如果我选择c++11或c++14,则会发生错误。如果我选择c++1z,没有错误。为什么完美转发需要知道Node::data_size的地址,它只在两个方面起作用:第一,它应该是模板函数,第二,它应用引用折叠规则可能完美不完美…为什么完美转发需要知道Node::data_size的地址,它只在两个方面起作用:第一,它应该是模板函数;第二,它应用引用折叠规则。可能完美并不完美。。。
std::shared_ptr<View> v(new View(data_size));
std::shared_ptr<View> v = std::make_shared<View>(data_size);