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 – 需要一些明确的模板实现代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)