加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:52:54 所属栏目:百科 来源:网络整理
导读:我正在使用一些模板类和方法(几乎只有模板)的C库.我想拆分声明和实现以便更容易阅读.但有时它变得疯狂: template typename T class Foo { template typename U class SubFoo { }; template typename U SubFooU bar();};template typename T template typena
我正在使用一些模板类和方法(几乎只有模板)的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>的确切类型集时,这才是一个很好的解决方案(恕我直言).可以实施.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读