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

时间:2012-06-18 11:59:11

标签: c++ templates visual-c++ c++11

说实话,我真的不知道如何命名这个问题。我只会显示无效的代码:

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就可以了。

解决方案,解决方法以及理论解释为什么我在做一些完全错误的事情将受到高度赞赏。 TIA。

4 个答案:

答案 0 :(得分:7)

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){

}

请注意,此处的订单很重要。

答案 1 :(得分:5)

这是正确的语法:

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

}

你不是说foo是一个带有2个模板参数的类模板。

答案 2 :(得分:4)

有两个级别的模板,您必须单独指定它们

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

答案 3 :(得分:0)

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

如果你不能打破循环依赖关系,那么你可能应该重新考虑这两个模板是否应该在不同的组件中(在这种情况下是标题),因为这两个模板中没有一个看起来没有另一个。