c – 需要一些明确的模板实现代码
我正在使用一些模板类和方法(几乎只有模板)的C库.我想拆分声明和实现以便更容易阅读.但有时它变得疯狂:
template < typename T > class Foo { template < typename U > class SubFoo { }; template < typename U > SubFoo<U> bar(); }; template < typename T > template < typename U > Foo<T>::SubFoo<U> Foo<T>::bar() {} 这是一个非常小的例子…… Ps:我没有任何c限制. 事实上,我忘记了C中存在一些像宏这样的基本内容. #define Class Foo<T> template < typename T > template < typename U > Class::SubFoo<U> Class::bar() {} 不是很好,但还是更好.无论如何没有宏吗? 解决方法
也许你是对的,当你说“同一个文件中的所有东西都是一团糟”时,但是使用模板结构/类很难避免. 以下是一个简单的例子 假设您有三个文件 1)标题(“header.h”)其中定义了一个模板struct foo,其中包含一个已定义但未实现的构造函数 template <typename T> struct foo { foo (); }; 2)一个cpp文件(“a.cpp”),其中一个main(),其中一个foo< int>声明变量 #include "header.h" int main () { foo<int> fi; } 3)实现foo构造函数的cpp文件(“b.cpp”) #include "header.h" template <typename T> foo<T>::foo () { } 不错,不是吗? 但是当你编译(我使用clang -c -o ao a.cpp和clang -c -o bo b.cpp)和link(clang -o a.out ao bo)时,你会在链接阶段出现错误:undefined reference to foo< int> :: foo() 为什么? 这是因为编译“b.cpp”,编译器不知道在“a.cpp”中它声明了一个foo< int>变量,所以不实现foo< int> :: foo(). 是的,您可以明确地告诉编译器,编译“b.cpp”,它必须实现foo< int>所需的内容,修改“b.cpp”如下 #include "header.h" template <typename T> foo<T>::foo () { } template struct foo<int>; 但是当你想要使用foo< long>在不同的源文件中,您必须记住相应地更新“b.cpp”. 只有当你想要控制foo< T>的确切类型集时,这才是一个很好的解决方案(恕我直言).可以实施. 通常(恕我直言)最好的解决方案是在头文件中实现所有模板结构/类,并且(像往常一样)恕我直接在结构/类的主体中实现它 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |