当.h具有模板类时编译文件失败[重复]

问题描述 投票:0回答:1

我是 C++ 初学者。我将头文件和源文件存储在不同的文件夹中,如下所示。当我尝试编译时,我无法编译成功。

test
├── inc
│   └── A.h
├── src
│   └── A.cpp
└── test.cpp

测试.cpp

#include <iostream>
#include "inc\\A.h"
int main() {
    A<int> a;
    std::cout << a.test();
    return 0;
}

啊啊

#ifndef A_H
#define A_H

template <class T>
class A{
public:
    int test();
};

#endif

A.cpp

#include "..\\inc\\A.h"

template<class T> 
int A<T>::test() {
    return 5;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(CPPproject)
SET(MAIN test.cpp)
SET(CMAKE_CXX_STANDARD 17)

SET(Home "D:\\study\\test")
SET(EXECUTABLE_OUTPUT_PATH ${Home})
include_directories("${PROJECT_SOURCE_DIR}/inc")
file(GLOB MAIN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB MAIN_HEAD "${CMAKE_CURRENT_SOURCE_DIR}/inc/*.h")

add_executable(test ${MAIN} ${MAIN_SRC})

错误:

[build] [ 14%] Linking CXX executable D:\study\test\test.exe
[build] CMakeFiles\test.dir/objects.a(test.cpp.obj): In function `main':
[build] D:/study/test/test.cpp:165: undefined reference to `A<int>::test()'
[build] collect2.exe: error: ld returned 1 exit status
[build] mingw32-make.exe[2]: *** [CMakeFiles\test.dir\build.make:184: D:/study/test/test.exe] Error 1
[build] mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/test.dir/all] Error 2
[build] mingw32-make.exe: *** [Makefile:90: all] Error 2

感谢您的帮助。修改代码后终于发现了真正的问题。在我的 .h 文件中,有一个模板类。当我将其声明为常规类时,编译过程没有任何问题。但是,一旦我将其更改为模板,就会出现编译错误。

c++ compiler-errors
1个回答
2
投票

您当前未在编译中包含

A.cpp
,链接器需要它来解析
A()
函数。

您的

CMakeLists.txt
文件应如下所示:

cmake_minimum_required(VERSION 3.5)
project(CPPproject)
SET(MAIN test.cpp)
SET(CMAKE_CXX_STANDARD 17)

SET(Home "D:\\study\\test")
SET(EXECUTABLE_OUTPUT_PATH ${Home})
include_directories("${PROJECT_SOURCE_DIR}/inc")
file(GLOB MAIN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB MAIN_HEAD "${CMAKE_CURRENT_SOURCE_DIR}/inc/*.h")

add_executable(test ${MAIN} ${MAIN_SRC})

这实际上会将名为

A.cpp
的源文件包含到您的编译中。

为什么当您将

A.cpp
文件包含到
tests.cpp
文件中时它会起作用,因为实际的函数定义最终在您的
test.cpp
文件中,并且
A()
函数与其余代码一起编译在
test.cpp
文件。

© www.soinside.com 2019 - 2024. All rights reserved.