2012-06-18 112 views
0

说实话,我真的不知道如何命名该问题。我只会显示不工作的代码:C++模板:使用模板参数分离定义和实现

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。

回答

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

} 

注意的是,这里的秩序问题。

5

这是正确的语法:

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

} 

您另有说foo是一个类模板,它需要2个模板参数。

4

有模板的两个级别,你必须单独指定

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

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

如果不能打破循环依赖,那么也许你应该重新考虑两个模板是否应该在不同的组件(在这种情况下头),因为没有这两个似乎是有效的没有其他。

+0

我在发布的代码中看不到任何循环依赖项。 – Nawaz

+0

@Nawaz:我假设有一次,由于行:*我想分开的定义从实施,以避免循环依赖问题*然后再次,正如众议院说*人们说谎*,所以你不能总是相信什么问题 –

+0

我认为由于编译错误,他错误地得出结论,这是因为循环依赖问题(甚至不存在)。 – Nawaz