【问题标题】:Passing pointer to member func of outer class template to nested class将指向外部类模板的成员函数的指针传递给嵌套类
【发布时间】:2014-12-17 22:57:19
【问题描述】:

我很难将指向成员函数Outer<T>::foo 的指针传递给嵌套类Outer 的构造函数,如下所示(另请参见ideone)。

template<typename T1>
struct Outer
{
    void foo()
    {
    }

    Outer() : inner( &Outer::foo )  // ERROR: compiles without &Outer::foo and Inner( F f ), below
    {
    }

    template<typename T2, void (T2::*F)()>
    struct Inner
    {
        Inner( F f )    // ERROR
        {
        }
    };

    Inner<Outer,&Outer::foo> inner;
};

int main()
{
    Outer<int> outer;
}

我做错了什么?我开始怀疑这是否可能。

【问题讨论】:

  • 你指的不是Outer::foo,没有考虑扩展版本。编译器在尝试实例化模板本身时还不知道要抓取哪个特定的函数指针!
  • F 不是类型,它是函数指针。如果您已经知道对象是什么,为什么还要传递参数?
  • 抱歉,我没有看到任何嵌套类...
  • @Bot 嗯? Outer&lt;T1&gt;::Inner 是嵌套模板类型。
  • 仍然没有看到任何类,只有结构和模板

标签: c++ templates nested-class


【解决方案1】:

问题在于您将变量和模板参数混为一谈。您可以使用常量指针作为模板参数,也可以将变量指针作为参数传递给函数。

这行得通:

template<typename T1>
struct Outer
{
    void foo()
    {
    }

    Outer() : inner( &Outer::foo ) 
    {
    }

    template<typename T2>
    struct Inner
    {
        // Takes a pointer at runtime to any matching signature in T2
        Inner( void (T2::*f)( ) ) 
        {
        }
    };

    Inner<Outer> inner;
};

int main()
{
    Outer<int> outer;
}

Live

或者这样可行:

template<typename T1>
struct Outer
{
    void foo()
    {
    }

    Outer() : inner( )  
    {
    }

    // Takes a pointer at compile time to a matching function in T2
    template<typename T2, void (T2::*f)()>
    struct Inner
    {
        Inner( )
        {
        }
    };

    Inner<Outer,&Outer::foo> inner;
};

int main()
{
    Outer<int> outer;
}

Live

【讨论】:

  • 非常感谢。这是您的解决方案的一个版本 ideone.com/LyYZKG 。奇怪的是,虽然是私人的,但我可以从Inner 呼叫Outer&lt;T&gt;::foo()。标准允许吗?顺便说一句,我在 MSVC 2013 和 GCC 4.8.3 中测试过
  • 这是合法的,因为实际上传递指针的是Outer。基本上,拥有所有组件权限的 Outer 类选择将指针传递给其他人。在类之外,它只是一个指针,不检查公共/私有。如果Inner 试图直接访问Outer&lt;T&gt;::foo(),它将被拒绝。
  • 这很有趣,杰伊。它非常类似于将引用传递给外部的私有成员。请参阅我的以下问题stackoverflow.com/questions/27537482/…
  • 一个有用的后续。谢谢。
猜你喜欢
  • 2018-12-07
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2012-07-05
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多