我一直在阅读设计模板代码有一个问题。大部分的解决方案,与设计相关的代码为模板的问题似乎要么是:模板链接和分离.h和.cc文件
- 原型的认沽定义成头文件
- 使用出口关键字like this(这需要一个额外的编译器选项)
- 具体说明如何在.cc/.cpp文件中使用模板。
例如:
// File: foo_impl.cc
// We're working with Class Foo
#include "foo.cc"
template class Foo <int>;
template class Foo <string>;
// etc.
这些方法都显得非常有效。除非我错过了某些东西,否则它们似乎没有提供让用户简单导入头文件并将模板代码链接到(.cc文件中)而无需做额外工作的功能。我想知道是否人们可以看看我在用自己的代码做什么,并告诉我这些代码是否违反了某种最佳实践协议,或者是否可能导致我只是看不到的问题。这就是我一直在做...
在main.cc:
#include <iostream>
#include "foo.h"
using namespace std;
int main (void) {
Foo <string> f ("hello world");
string s = f.get();
cout << s << endl;
return 0;
}
foo.h中:
#ifndef FOO_H
#define FOO_H
template <class T>
class Foo {
public:
Foo (T);
T get();
private:
T data;
};
#endif
#include "foo.cc"
在foo.cc:
#ifndef FOO_CC
#define FOO_CC
#include "foo.h"
template <class T>
Foo :: Foo (T stuff) {
data = stuff;
}
template <class T>
T Foo <T> :: get() {
return data;
}
#endif
我已经能够用gcc 4.1.2中的所有警告来编译代码。谢谢!
你只是想单独的文件就像我们正常的c + +文件,有定义和声明在单独的文件?或者您认为您可以避免将您的实现代码分享给其他将要将您的代码用作库的用户?你能详细说明你想达到什么吗? – havexz
我只是想把我的模板代码看作是另一个.h和.cc文件。我希望有一个头文件,它可以很容易地读取通话内容,而不会使其膨胀。 – dorsalfinsalsa
我其实也是这样做的,用'#ifdef _DEBUG template class Foo; #endif',所以我可以强制它使用MSVC进行编译,并确保所有东西都没有错误地实例化。 –