C ++:非内联模板方法的放置

时间:2012-08-27 12:48:03

标签: c++ templates include

假设我有一个带有方法模板的类:

//file: X.h
class X{

    int x;
    //... more members and non-template functions

    template<typename T>
    void foo(T t){ //Error, cannot define the method here. Declaration is okay
        Y y = ...;
    }
}

//file Y.h
class Y {
    X x;
}

由于循环类依赖(foo的主体依赖于Y而Y依赖于X),我无法定义我声明它的方法模板foo(请不要现在质疑设计)。

那么,在这种情况下,将foo的定义放在何处?我无法将其他定义放入.cpp文件中,否则链接将失败。

我的解决方案是创建一个新的头文件,例如&#34; X.hpp&#34;并且只将模板方法的定义添加到其中。在这个文件中,我包括&#34; X.h&#34;和&#34; Y.h&#34;。现在,每当我需要X类时,我只需要包含&#34; X.hpp&#34;这将包括其他必要的h文件。

所以我的问题是:这是正确/最好的方法吗?它以某种方式让我觉得我只有一个单独的方法模板定义的.hpp文件,但它似乎是圆形类型依赖的唯一可行方法。请再说一遍:不要质疑设计,并说#34;最好避免使用循环类型依赖&#34;或类似的东西。问题是:如果我有这些依赖关系,那么处理单个方法模板的最佳方法是什么。

1 个答案:

答案 0 :(得分:5)

不用质疑设计:

//file: X.h
#ifndef X_H
#define X_H
class X{

    int x;
    //... more members and non-template functions

    template<typename T>
    void foo(T t);
};

#include "Y.h"

template<typename T>
void X::foo(T t){ //Error, cannot define the method here. Declaration is okay
    Y y = ...;
}

#endif


//file Y.h
#ifndef Y_H
#define Y_H

#ifndef X_H
#error "Please include X.h"
#endif

class Y {
    X x;
}

#endif

不需要额外的文件。