假设我写了一个类模板,比如Vector<typename T>
。我想向我的客户公开using fvec = Vector<float>;
和using dvec = Vector<double>;
。
理想情况下,我不希望我的客户知道模板Vector
是如何实现的,或者更好,他们只需知道fvec
和dvec
的存在以及预编译的文件
答案 0 :(得分:0)
如果你想只为double和float提供客户端头文件和实现,你可以显式地将模板类实例化为cpp文件。
http://en.cppreference.com/w/cpp/language/class_template
e.g。你在cpp文件中需要这样的东西
template class Vector<float>;
template class Vector<double>;
为了方便使用,你也可以在h文件中做一些typedef - 这是因为有人可能会决定使用&#34; quadruple&#34; type(libquadmath)
或者你可以在从模板继承的h文件中创建更多的clases,但这与typedef相同。
答案 1 :(得分:0)
这是一个构建和运行的简单程序。类模板cdHtml="${postAdBean.cdHtml}";
的实现隐藏在Foo.cc中。
foo.h中
Foo
Foo.cc
#pragma once
template <typename T> class Foo
{
public:
Foo();
void test();
};
template class Foo<float>;
template class Foo<int>;
main.cc
#include "Foo.h"
#include <iostream>
template <typename T> Foo<T>::Foo()
{
}
template <typename T> void Foo<T>::test()
{
std::cout << "Came to Foo<T>::test\n";
}
构建命令:
#include "Foo.h"
int main()
{
Foo<int> f1;
f1.test();
Foo<float> f2;
f2.test();
// Uncommenting these lines results in linker error.
// Foo<double> f3;
// f3.test();
}
我也可以使用:
构建g++ -Wall -std=c++11 Foo.cc main.cc -o program
您可以发送Foo.h和包含Foo.o的库。您的客户将仅限于使用g++ -Wall -std=c++11 -c Foo.cc
g++ -Wall -std=c++11 -c main.cc
g++ -Wall -std=c++11 Foo.o main.o -o program
和Foo<int>
。