gpt4 book ai didi

c++ - 为什么在使用静态 constexpr 成员构造时 std::make_shared 与 new 不同?

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:51 24 4
gpt4 key购买 nike

<分区>

#include <iostream>
#include <vector>
#include <memory>

class Node{
public:
static constexpr int data_size = sizeof(int);
};

class View{
public:
View(int size){
}
};

class Header: public Node{
public:
void foo(){
std::shared_ptr<View> v = std::make_shared<View>(data_size);
}

void bar(){
std::shared_ptr<View> v(new View(data_size));
}
View bar1(){
return View(data_size);
}
void bar2(){
View *v = new View(data_size);
}
int bar3(){
return data_size;
}
};

int main() {

Header *h = new Header();

// This 1 lines below will produce the error
h->foo();

// These 4 lines are ok
h->bar();
h->bar1();
h->bar2();
h->bar3();

return 0;
}

当调用 foo() 时,会出现如下错误:

/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

当我用new初始化shared_ptr时是可以的,但是当我用make_shared时,出现链接错误。

为什么 std::make_shared 在构造静态 constexpr 成员时与 new 不同?

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

cmake_minimum_required(VERSION 3.6)
project(cpptest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(cpptest ${SOURCE_FILES})

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com