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

use*_*081 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

在没有包含模板参数的参数的情况下实现foo :: f工作正常.但是,我并没有真正解决该参数的问题.

代码应该使用gcc 4.7和(甚至更重要的)Visual Studio 2010.只要所提到的平台支持,C++ 11就可以了.

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

Naw*_*waz 7

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

}
Run Code Online (Sandbox Code Playgroud)

这是错误的语法.

正确的语法是使用template两次:

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

}
Run Code Online (Sandbox Code Playgroud)

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


mfo*_*ini 5

这是正确的语法:

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

}
Run Code Online (Sandbox Code Playgroud)

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