C++模板:使用模板参数分离定义和实现

C++ templates: separation of definition and implementation using template arguments

本文关键字:分离 参数 定义 实现 模板 C++      更新时间:2023-10-16

老实说,我真的不知道如何命名这个问题。我只显示不起作用的代码:

template<int SIZE>
struct bar{
};
template<int SIZE>
struct foo{
    template<int X>
    void f(bar<X> b);
};
template<int SIZE, int X>
void foo<SIZE>::f(bar<X> b){
}

int main(){
    foo<1> f;
    bar<2> b;
}

我想将定义与实现分开,以避免循环依赖问题。分离仅在头文件中完成,我不想将模板代码放入 cpp 文件中。在这种情况下,使用指针是没有选择的。重构已被考虑过,但也不是真正的选择。

在没有本身具有模板参数的参数的情况下实现 foo::f 工作正常。不过,我并没有真正了解该参数的问题。

代码应该使用 gcc 4.7 和(更重要的是)Visual Studio 2010 工作。只要上述平台支持,C++11 就可以了。

解决方案,解决方法以及理论解释为什么我做完全错误的事情将不胜感激。蒂亚。

template<int SIZE, int X>    //problem : what is what here?
void foo<SIZE>::f(bar<X> b){
}

这是错误的语法。

正确的语法是将template两次用作:

template<int SIZE>   //for the class template
template<int X>      //for the member function template
void foo<SIZE>::f(bar<X> b){
}

请注意,顺序在这里很重要。

这是正确的语法:

template<int SIZE>
template<int X>
void foo<SIZE>::f(bar<X> b){
}

否则,您说foo是一个接受 2 个模板参数的类模板。

模板有两个级别,您必须分别指定它们

template<int SIZE>
template<int X>
void foo<SIZE>::f(bar<X> b){  }

循环依赖是你的主要问题。你真的需要它们吗?尝试以依赖关系形成有向无环图的方式打破您的问题,并且通常最终会得到更好的解决方案。

如果您无法打破循环依赖关系,那么也许您应该重新考虑这两个模板是否应该位于不同的组件中(在本例中为标头),因为如果没有另一个模板,这两个模板似乎都无效。