只有静态方法的模板 class 使用 .cpp 文件实现时出错
Template class with only static methods Implementation using .cpp file giving error
我正在尝试用 C++ 实现 class,其中包含我可能需要在不同 class 层次结构(该项目有多个不同的继承树)中使用的大部分功能。
在通读 Stack overflow, Why can templates only be implemented in the header file? I decided to implement this using a .h file and 2 different .cpp files. I tried to implement a small test case using this FAQ as a guideline 上针对此类实施的多个答案并听取了建议之后。代码如下:
test.h
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <cmath>
#include <complex>
template<typename T>
class test{
public:
static bool IsClose(const T &a, const T &b);
};
#endif
testImpl.h
#include "test.h"
template <typename T>
bool test<T>::IsClose(const T &a, const T &b){
return (std::abs(a-b) <= (1e-8 + 1e-5 * std::abs(b)));
}
testImpl.cpp
#include "testImpl.h"
template class test<int>;
template class test<double>;
main.cpp
#include "test.h"
#include <iomanip>
int main(){
std::cout << std::boolalpha << test<double>::IsClose(1e-7,1.1e-7) << std::endl;
return 0;
}
使用 g++ -o test main.cpp testImpl.cpp
编译时出现以下错误:
main.cpp: In function ‘int main()’:
main.cpp:4:36: error: ‘test’ is not a template
std::cout << std::boolalpha << test<double>::IsClose(1e-7,1.1e-7) << std::endl;
如果有人能告诉我哪里出错了,我们将不胜感激。提前致谢!!此外,如果有更好的方法来实现我正在尝试做的事情,也欢迎您就此事发表意见。
我终于明白了。我需要让编译器知道它需要使用更新版本的 C++。所以, g++ -std=c++17 -o test main.cpp testImpl.cpp
完美地为我编译了代码。
仅当您使用 gcc 7.5.0 版时才需要使用 -std 标志。在它之后的所有 gcc 版本,使用 g++ -o test main.cpp testImpl.cpp
.
我正在尝试用 C++ 实现 class,其中包含我可能需要在不同 class 层次结构(该项目有多个不同的继承树)中使用的大部分功能。
在通读 Stack overflow, Why can templates only be implemented in the header file? I decided to implement this using a .h file and 2 different .cpp files. I tried to implement a small test case using this FAQ as a guideline 上针对此类实施的多个答案并听取了建议之后。代码如下:
test.h
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <cmath>
#include <complex>
template<typename T>
class test{
public:
static bool IsClose(const T &a, const T &b);
};
#endif
testImpl.h
#include "test.h"
template <typename T>
bool test<T>::IsClose(const T &a, const T &b){
return (std::abs(a-b) <= (1e-8 + 1e-5 * std::abs(b)));
}
testImpl.cpp
#include "testImpl.h"
template class test<int>;
template class test<double>;
main.cpp
#include "test.h"
#include <iomanip>
int main(){
std::cout << std::boolalpha << test<double>::IsClose(1e-7,1.1e-7) << std::endl;
return 0;
}
使用 g++ -o test main.cpp testImpl.cpp
编译时出现以下错误:
main.cpp: In function ‘int main()’:
main.cpp:4:36: error: ‘test’ is not a template
std::cout << std::boolalpha << test<double>::IsClose(1e-7,1.1e-7) << std::endl;
如果有人能告诉我哪里出错了,我们将不胜感激。提前致谢!!此外,如果有更好的方法来实现我正在尝试做的事情,也欢迎您就此事发表意见。
我终于明白了。我需要让编译器知道它需要使用更新版本的 C++。所以, g++ -std=c++17 -o test main.cpp testImpl.cpp
完美地为我编译了代码。
仅当您使用 gcc 7.5.0 版时才需要使用 -std 标志。在它之后的所有 gcc 版本,使用 g++ -o test main.cpp testImpl.cpp
.