是否可以编译c ++类模板实例?

时间:2016-12-09 05:48:17

标签: c++ class templates

假设我写了一个类模板,比如Vector<typename T>。我想向我的客户公开using fvec = Vector<float>;using dvec = Vector<double>;

理想情况下,我不希望我的客户知道模板Vector是如何实现的,或者更好,他们只需知道fvecdvec的存在以及预编译的文件

2 个答案:

答案 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>