离开C++几年了,我从下面的代码中得到一个链接器错误:
Gene.h
#ifndef GENE_H_INCLUDED
#define GENE_H_INCLUDED
template <typename T>
class Gene {
public:
T getValue();
void setValue(T value);
void setRange(T min, T max);
private:
T value;
T minValue;
T maxValue;
};
#endif // GENE_H_INCLUDED
Run Code Online (Sandbox Code Playgroud)
Gene.cpp
#include "Gene.h"
template <typename T>
T Gene<T>::getValue() {
return this->value;
}
template <typename T>
void Gene<T>::setValue(T value) {
if(value >= this->minValue && value <= this->minValue) {
this->value = value;
}
}
template <typename T>
void Gene<T>::setRange(T min, T max) {
this->minValue = min;
this->maxValue = …Run Code Online (Sandbox Code Playgroud) 我们正在设计一个新的C++库,并决定采用基于模板的方法以及针对极端情况的一些特定的部分模板特化.特别是,这将是一个仅标题模板库.
现在,有人担心这会导致二进制文件中的大量代码重复,因为这个模板"库"将被编译到任何其他共享库或使用它的可执行文件中(可以说只是那些使用的部分).我仍然认为这不是一个问题(特别是,编译器甚至可以内联它不能跨共享库边界的东西).
但是,既然我们知道将要使用的有限类型的集合, 有没有办法将这个头编译成一个库,并提供一个只有声明而不是其他的不同的头?请注意,库不仅必须包含通用实现,还必须包含部分特化.
我在win7中使用VS2008,在CentOS 18中使用g ++ 4.7.只有在我使用动态共享库时才能在Windows上看到这个问题.当我转换它静态库时程序链接正常.
据我所知,在共享库模板函数/类中应该在头文件或模板中定义模板类型(参数)的实例化应该通过编译单元提供.我选择了后一个选项.我以前做过,我经历过
但我无法弄清楚为什么在Windows中将库转换为DLL后无法解析符号:错误LNK2019:未解析的外部符号"void __cdecl HelpingRegistration(double)"(?? $ HelpingRegistration @ N @@ YAXN @ Z)在函数_main中引用
在Windows中,它可以与静态库一起使用.在Linux中,动态和共享库都可以工作.
//Static library
//Library header
#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_
#include <iostream>
#include <string>
#include "Export.h"
template<typename T>
class EXPORT TemplatedStaticLib
{
public:
TemplatedStaticLib(){};
~TemplatedStaticLib(){};
void print(T t);
};
template<typename T>
EXPORT void HelpingRegistration(T);
#endif
Run Code Online (Sandbox Code Playgroud)
//库.cpp
#include "TemplatedStaticLib.h"
#include <typeinfo>
template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
std::cout << "Templated Print: "<< t<< " type:: " << typeid(t).name() << std::endl;
}
//Class Template explicit …Run Code Online (Sandbox Code Playgroud) 我正在阅读"CLR Via C#"一书,并在泛型章节中说:
源代码protecton
使用通用算法的开发人员无需访问算法的源代码.但是,对于C++模板或Java的泛型,算法的源代码必须对使用该算法的开发人员可用.
任何人都可以解释这究竟是什么意思?