2013-03-18 84 views
0

我在模板和组合风格编码方面遇到了一些麻烦。我有一个对象在* this参数的另一个构造函数中创建。对不起,如果我不清楚。代码如下:使用用户定义的类作为参数的模板

在outer.h文件:

class outer { 
    public: 
    outer(int w, int l); 
    int getWidth(); 
    int getLength(); 
    private: 
    inner<outer> test(*this); 
    int width; 
    int length; 
}; 

outer::outer(int w, int l) { 
    width = w; 
    length = l; 
} 

int outer::getLength() { 
    return length; 
} 

在inner.h文件

template<typename T> 
class inner { 
    public: 
    inner(T &name); 
    private: 
    int top; 
    int bot; 
}; 

template<typename T> 
inner<T>::inner(T &name) { 
    top = name.getLength() /2; 
    bot = -name.getLength()/2; 
} 

我不知道这是允许的,因为我可以”在网上找到解决这个问题的东西。编译器在outer.h中的这个语句有问题。

在此先感谢您的帮助。

+0

确保您使用C++ 11进行编译,并且您的编译器支持该功能。 – chris 2013-03-19 00:01:27

+0

@chris只能用'='或'{}',而不能用'()'。 – juanchopanza 2013-03-19 00:06:35

+0

@ juanchopanza,哦,是的,没错。无论如何,无论如何我都会使用{}。 – chris 2013-03-19 00:37:24

回答

3

如果您使用C++ 03,则必须在构造函数中执行初始赋值。

class outer { 
    public: 
    outer(int w, int l); 
    int getWidth(); 
    int getLength(); 
    private: 
    // Member variables are initialized in the order they are declared here. 
    int width; 
    int length; 
    inner<outer> test; 
}; 

outer::outer(int w, int l) 
    : width(w) 
    , length(l) 
    , test(*this) 
{ 
} 

编辑: Kerrek SB还指出,需要您的变量的顺序被改变。它们按照您在课堂上声明的顺序进行初始化,并且test需要最后被初始化,所以其他变量被初始化。

+0

感谢您的回应。我试过这个,编译器会抛出错误“不匹配呼叫”(内部)(outer&)'“。任何想法是什么意思? – MrDiggles 2013-03-19 00:07:39

+0

在任何情况下,这都是未定义的行为,因为整数没有及时初始化。 – 2013-03-19 00:09:19

+0

@KerrekSB感谢您的抽查。 – 2013-03-19 00:13:54

相关问题