2011-07-07 166 views
0

模板类和init我有一个模板类,富:C++中的构造函数

template <class A, class B> 
class Foo 
{ 
public: 
    Foo(A &aInstance); 

private: 
    Attr<Foo> _attr; 
}; 

然后我还有一个叫的Attr模板类,这是我的Foo类的属性,这需要作为模板参数Foo类本身。

template <class C> 
class Attr 
{ 
    class SomeType 
    { 
     SomeType(); 
     ~SomeType(); 
    }; 

    Attr(const SomeType* st); 
    ~Attr(); 

private: 
    Attr(); 
} 

我想在构造函数中初始化_attr(属性类型为Attr),将第一个参数从模板中转换为SomeType。

富构造实施:

template<class A, class B> 
Foo<A, B>::Foo(A &aInstance): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) aInstance) 
{ 

} 

这不会编译:

错误:预期主表达式之前“)”令牌

该错误是指铸造线在富构造器实现,就好像SomeType不被识别一样。

我现在有一个实例,但仍然有相同的错误。

+0

我已经回滚了您的上次编辑,因为它使问题(及其答案)变得荒谬。请不要这样做。至于其他编辑:这些*也*干扰现有的答案;我没有把它们回滚,但请将来*增加*进一步澄清,不要更改现有的代码。 –

回答

1

0)

(Attr<Foo<A, B> >::SomeType *) A) 

在这一点上,A是类型名,即一类的名称,因此,没有任何你可以施放。

1)

此外,Foo<A,B>取决于AB,因此,Attr<Foo<A, B> >是一个从属名称,太。因此,你需要一个typename那里,以便告诉编译器SomeType是一种类型:

(typename Attr<Foo<A, B> >::SomeType *) somePointer) 

2)

此外,在C++中,一般喜欢C++ - 蒙上C-风格转换。你会发现他们犯了很多错误。又见this tutorial :)

3)

在另一方面:你确定你需要设计的中投,还是应该Attr点整整Foo<A, B>

2
template<class A, class B> 
Foo<A, B>::Foo(): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) A) 
{ 

} 

A是一种类型,并且您试图将它传递给构造函数。你需要一个实例。

+1

我相信'typename'在这里也是必要的 –

+0

你是对的!非常感谢 – Jack

1

首先,Attr类没有(在你的代码片段中)使用C类型,所以你应该解释它在哪里使用,以及C和SomeType之间的关系是什么。

其次,在该线

Foo<A, B>::Foo(): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) A) 

A是类型,而不是一个对象。如果_attr应该用Foo对象本身初始化,那么你应该传递这个指针。

Foo<A, B>::Foo(): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) this) 

然而,这一点上,Foo对象尚未建立,所以要小心你在的Attr构造函数指针做些什么。

0

试着改变你的构造函数:

template<class A, class B> 
Foo<A, B>::Foo(A &aInstance): 
    _attr(
     (typename Attr<Foo<A, B> >::SomeType *) &aInstance) {} 

你会的,因为你需要一个指针,需要以采取实例对象的地址添加一个地址的操作...否则aInstance会不是指针类型,而是引用类型,它实际上与传递对象本身(通过引用)相同,而不是指向对象的指针。

0

这对我有用。几个typedefs有助于使模板代码更容易理解:

template<class C> 
class Attr 
{ 
public: 
    class SomeType 
    { 
     SomeType(); 
     ~SomeType(); 
    }; 

    typedef typename Attr<C>::SomeType ReachIntoSomeType; 

    Attr(const SomeType* st) { } 
    ~Attr() { } 

private: 
    Attr(); 
}; 

template <class A, class B> 
class Foo 
{ 
public: 
    Foo(A &aInstance) : _attr(reinterpret_cast<AttrOfFoo::ReachIntoSomeType*>(aInstance))  
    { } 

private: 
    typedef Attr<Foo> AttrOfFoo; 
    AttrOfFoo _attr; 
}; 
+0

好神!代码完全搞砸了!第一次在SO。有人能帮我纠正吗?谢谢! – ForeverLearning