C++ 在内部类中使用引用模板参数
这是我的代码:C++ 在内部类中使用引用模板参数,c++,c++11,C++,C++11,这是我的代码: template<class V, class Ref = V&> class Util { public: typedef Ref reference; }; template<class D, class V, class Ref = V&> class Base { public: class Inner1: public Util<const V, const Ref> { public:
template<class V, class Ref = V&>
class Util {
public:
typedef Ref reference;
};
template<class D, class V, class Ref = V&>
class Base {
public:
class Inner1: public Util<const V, const Ref> {
public:
Inner1(const D &d) :
d(d) {
}
typename Inner1::reference foo() const {
static V v;
return v;
}
private:
const D &d;
};
class Inner2: public Util<V, Ref> {
public:
Inner2(D &d) :
d(d) {
}
typename Inner2::reference foo() const {
static V v;
return v;
}
private:
D &d;
};
};
class Child: public Base<Child, float> {
public:
Inner1 getInner1() const {
return Base<Child, float>::Inner1(*this);
}
Inner2 getInner2() {
return Base<Child, float>::Inner2(*this);
}
};
void print(float & ff) {
}
int main() {
Child c;
Child::Inner1 inner = c.getInner1();
print(inner.foo());
return 0;
}
这段代码编译没有问题,但我想我应该收到一个编译错误。类Inner1的方法foo应该返回const引用,但由于未知原因,Ref的定义没有const。为什么?const-Ref,给定的Ref是V&,即float&,注意const是在引用本身上限定的,而不是被引用的类型。刚才省略了const限定符,您仍然得到了V&,但并不像您预期的那样得到了const V&。确切地说,C++中没有const引用,而只引用const或unconst .<
如果将const Ref更改为const V&即,将reference更改为const,则会得到预期的错误。e、 g
class Inner1: public Util<const V, const V&> {
...
const Ref,给定Ref是V&,即float&,注意const是在引用本身上限定的,而不是被引用的类型。刚才省略了const限定符,您仍然得到了V&,但并不像您预期的那样得到了const V&。确切地说,C++中没有const引用,而只引用const或unconst .<
如果将const Ref更改为const V&即,将reference更改为const,则会得到预期的错误。e、 g
class Inner1: public Util<const V, const V&> {
...
但由于未知原因,Ref的定义没有常量。为什么?
前导常数具有误导性。在type Util中,您可以限定Ref类型。也就是说,您应该传递V&const作为类型,而不是V-const&。虽然通常V&const的格式是错误的,但在间接处理类型时,例如当它的别名或模板参数时,只会忽略额外的cv限定符
就我个人而言,我会对整个特征使用额外的模板参数
template<class V>
class VTrait {
public:
typedef V & reference;
typedef V const & const_reference;
};
template<class D, class V, class Trait = VTrait<V>>
class Base {
public:
class Inner1: public Util<const V, typename Trait::const_reference> {
// ...
};
// ...
};
想要与您的框架有所不同的客户机代码只需要自定义特性
但由于未知原因,Ref的定义没有常量。为什么?
前导常数具有误导性。在type Util中,您可以限定Ref类型。也就是说,您应该传递V&const作为类型,而不是V-const&。虽然通常V&const的格式是错误的,但在间接处理类型时,例如当它的别名或模板参数时,只会忽略额外的cv限定符
就我个人而言,我会对整个特征使用额外的模板参数
template<class V>
class VTrait {
public:
typedef V & reference;
typedef V const & const_reference;
};
template<class D, class V, class Trait = VTrait<V>>
class Base {
public:
class Inner1: public Util<const V, typename Trait::const_reference> {
// ...
};
// ...
};
想要与您的框架有所不同的客户机代码只需要自定义特性。我刚刚修改了代码,以提供一个最小的示例,但是Util是boost::iterator\u facade,因此无法修改it@greywolf82-然后创造你自己的特质。用我认为是你们的那个一个,而不是额外的论点。将其const_引用成员提供给boost::iterator_facade。我刚刚修改了我的代码以获得一个最小的示例,但是Util是boost::iterator_facade,所以我无法修改它it@greywolf82-然后创造你自己的特质。用我认为是你们的那个一个,而不是额外的论点。将其const_引用成员馈送到boost::iterator_facade。