代码之家  ›  专栏  ›  技术社区  ›  greywolf82

在内部类中使用引用模板参数

  •  1
  • greywolf82  · 技术社区  · 5 年前

    这是我的代码:

    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;
    }
    

    这段代码编译没有问题,但我想我应该会收到一个编译错误。类的foo方法 Inner1 应该返回 const 参考,但原因不明 Ref 常量 . 为什么?

    2 回复  |  直到 5 年前
        1
  •  2
  •   StoryTeller - Unslander Monica    5 年前

    但是由于未知的原因,Ref的定义没有const。为什么?

    领导警员有误导性。在类型中 Util<const V, const Ref> const Ref 键入。一、 e,你应该通过了 V & const 作为类型,而不是 V const & . 正常情况下 如果在间接处理类型时(例如当它是别名或模板参数时)格式不正确,则只会忽略额外的cv限定符。

    template<class V>
    class Trait {
    public:
        typedef V & reference;
        typedef V const & const_reference;
    };
    
    template<class D, class V>
    class Base {
    public:
        class Inner1: public Util<const V, typename Trait<V>::const_reference> {
         // ...
        };
    
      // ...
    };
    

    希望与您的框架有所不同的客户端代码只需要专门化 Trait

        2
  •  1
  •   songyuanyao    5 年前

    const Ref ,给定 Ref V& ,即。 float& const 常量 限定符被省略了,你仍然得到 V& ,但不是 const V& 如你所料。(准确地说,没有 常量 只在C++中 引用 常量 常量

    如果你改变 常量参考 (即参考 常量 ),将得到预期的错误。例如

    class Inner1: public Util<const V, const V&> {
        ...