У меня возникла следующая проблема компиляции с моим проектом с классом шаблона
Undefined symbols for architecture x86_64:
"Node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Node(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
_main 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]: *** [apps/main] Error 1
make[1]: *** [apps/CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2
Мои файлы структурированы следующим образом:
├── include
│ └── maple
│ └── node.hpp
├── src
│ ├── CMakeLists.txt
│ └── node.cpp
├── apps
│ ├── CMakeLists.txt
│ └── main.cpp
└── CMakeLists.txt
/ CmakeLists.txt
add_subdirectory(src)
add_subdirectory(apps)
/ src / CMakeLists.txt
set(HEADER_LIST "${maple_SOURCE_DIR}/include/maple/node.hpp")
add_library(node_lib STATIC node.cpp ${HEADER_LIST})
target_include_directories(node_lib PUBLIC ../include)
/ app / CMakeLists.txt
add_executable(main main.cpp)
target_link_libraries(main PRIVATE node_lib)
/ include / maple / node.hpp
template <class T>
class Node
{
private:
int key;
T value;
public:
Node();
Node(int key, T value);
};
/src/node.cpp
template<class T>
Node<T>::Node() {
}
template<class T>
Node<T>::Node(int key, T value) {
key = key;
value = value;
}
template Node<std::string>;
/ app / main. cpp
int main() {
Node<std::string> node(3, "abc");
return 0;
}
Может кто-нибудь подсказать мне, как правильно скомпилировать этот проект?
Я уже знаю, что шаблонный класс нуждается в реализации вместе с определением
Я спрашиваю, как добиться компиляции с использованием Cmake, когда .h и. cpp для шаблонного класса в разных каталогах, как в типичном C ++ проекте.