您好,感谢您的帮助! 我是一位经验丰富的Java开发人员,因此决定在业余时间重新学习c ++。现在,我有一个非常简单的程序遇到了严重的问题。我正在尝试使用模板...参数调用方法。
我在TestTemplate.cpp中定义了一个主要方法,该方法实例化了一个TestLib类,该类在TestLib.h中定义并在TestLib.cpp中实现。
最初是通过cmake进行编译的,然后我通过g ++和clang ++进行了编译。而且总是几乎一样。
通过cmake进行编译显示:
[ 25%] Building CXX object CMakeFiles/TestLib.dir/TestLib.cpp.o
[ 50%] Linking CXX static library libTestLib.a
[ 50%] Built target TestLib
[ 75%] Building CXX object CMakeFiles/TemplateTest.dir/TestTemplate.cpp.o
[100%] Linking CXX executable TemplateTest
/usr/bin/ld: CMakeFiles/TemplateTest.dir/TestTemplate.cpp.o: in function `main':
TestTemplate.cpp:(.text+0x8e): undefined reference to `void TestLib::doTemplateLibCall<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/TemplateTest.dir/build.make:85: TemplateTest] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:110: CMakeFiles/TemplateTest.dir/all] Fehler 2
make: *** [Makefile:84: all] Fehler 2
通过clang ++或g ++进行编译会产生以下输出:
/usr/bin/ld: /tmp/TestTemplate-85deb0.o: in function `main':
TestTemplate.cpp:(.text+0x92): undefined reference to `void TestLib::doTemplateLibCall<std::string>(std::string)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
奇怪的是:将TestLib.cpp的实现复制到TestTemplate.cpp的工作。当我尝试在自己的文件中实现TestLib.cpp时,才出现错误。
CMakeLists.txt:
cmake_minimum_required (VERSION 3.3)
project (TemplateTest)
set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (D_GLIBCXX_USE_CXX11_ABI 0)
include_directories("header")
add_library (TestLib TestLib.cpp)
add_executable (TemplateTest TestTemplate.cpp)
target_link_libraries (TemplateTest TestLib)
TestTemplate.cpp:
#include <iostream>
#include <string>
#include <TestLib.h>
template<typename... ParamType>
void doTemplateCall(ParamType... params) {
std::printf("In doTemplateCall\n");
}
int main() {
printf("In main..\n");
doTemplateCall(std::string("Hello world"));
TestLib lib;
lib.doTemplateLibCall(std::string("Hello lib world"));
}
TestLib.h:
#ifndef TestLibH
#define TestLibH
class TestLib {
public:
template<typename... ParamType>
void doTemplateLibCall(ParamType... params);
};
#endif
TestLib.cpp:
#include <iostream>
#include <TestLib.h>
template<typename... ParamType>
void TestLib::doTemplateLibCall(ParamType... params) {
std::printf("In doTemplateLibCall\n");
}