c – 需要一些明确的模板实现代码

c – 需要一些明确的模板实现代码,第1张

概述我正在使用一些模板类和方法(几乎只有模板)的C库.我想拆分声明和实现以便更容易阅读.但有时它变得疯狂: template < typename T >class Foo { template < typename U > class SubFoo { }; template < typename U > SubFoo<U> bar();};template < t 我正在使用一些模板类和方法(几乎只有模板)的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() {}

这是一个非常小的例子……
因此,如果你有一些别名来改进这个,或任何编码风格指南.
我正在使用NeoVim,所以如果你知道一些可以让生活更轻松的插件,它也会很好.

Ps:我没有任何c限制.

事实上,我忘记了C中存在一些像宏这样的基本内容.

#define Class Foo<T>template < typename T >template < typename U >Class::SubFoo<U> Class::bar() {}

不是很好,但还是更好.无论如何没有宏吗?

解决方法

I really like the header which describe the class and the source file where you can found the implementation. I think that everything in the same file is a mess

也许你是对的,当你说“同一个文件中的所有东西都是一团糟”时,但是使用模板结构/类很难避免.

以下是一个简单的例子

假设您有三个文件

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>的确切类型集时,这才是一个很好的解决方案(恕我直言).可以实施.

通常(恕我直言)最好的解决方案是在头文件中实现所有模板结构/类,并且(像往常一样)恕我直接在结构/类的主体中实现它

总结

以上是内存溢出为你收集整理的c – 需要一些明确的模板实现代码全部内容,希望文章能够帮你解决c – 需要一些明确的模板实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存