Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在内部类中使用引用模板参数_C++_C++11 - Fatal编程技术网

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。