This question already has answers here:
Why can templates only be implemented in the header file?
(17个答案)
去年关闭。
我正在学习C++,并使用CLion构建项目。我在
。
。
。
当我尝试构建和运行时,出现以下错误:
我没有向链接人提供什么信息?
同样,模板化定义通常可以在头文件中only be implemented。将以下函数定义从
(17个答案)
去年关闭。
我正在学习C++,并使用CLion构建项目。我在
main.cpp
目录中有main
文件。我还有一个main/Objects
目录,其中有Vec3.h
和Vec3.cpp
文件://Vec3.h
template<typename T>
class Vec3
{
public:
// 3 most basic ways of initializing a vector
Vec3() : x(T(0)), y(T(0)), z(T(0)) {}
Vec3(const T &xx) : x(xx), y(xx), z(xx) {}
Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}
T x, y, z;
T length();
};
。
//Vec3.cpp
#include "Vec3.h"
#include <stdio.h>
#include <math.h>
template <typename T>
T Vec3<T>::length()
{
return sqrt(x * x + y * y + z * z);
}
。
//main.cpp
#include <iostream>
#include "Objects/Vec3.h"
int main() {
Vec3<double> vec(3, 4, 0);
std::cout << "Hello, World!" << std::endl;
std::cout << vec.length() << std::endl;
return 0;
}
。
//CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
project(Testing)
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp Objects/Vec3.cpp)
add_executable(Testing ${SOURCE_FILES})
当我尝试构建和运行时,出现以下错误:
undefined reference to "Vec3<double>::length()". ld returned 1 exit status
我没有向链接人提供什么信息?
最佳答案
您尚未将标题文件告知CMake,因此可以使用 target_include_directories
。将以下行添加到CMakeLists.txt
文件的末尾,以确保 header 包含在构建中:
target_include_directories(Testing PRIVATE Objects)
同样,模板化定义通常可以在头文件中only be implemented。将以下函数定义从
Vec3.cpp
文件移动到头文件(Vec3.h
):template <typename T>
T Vec3<T>::length()
{
return sqrt(x * x + y * y + z * z);
}
关于c++ - C++链接的代理找不到函数声明( undefined reference ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57413274/
10-09 13:28