【问题标题】:Pointer to a template member with auto return 'type' in c++?在 C++ 中指向具有自动返回“类型”的模板成员?
【发布时间】:2014-12-24 10:45:14
【问题描述】:

以前我不得不在各种情况下使用指向成员函数的指针。通常,我使用mem_fun。但是,这是我第一次尝试在返回auto 的成员模板上使用它。如果成员不是模板,它确实适用于auto return 'type',如果指定了返回类型,它也适用于成员模板。另外,我尝试将预期类型直接传递给mem_fun(),但没有帮助。

任何不依赖 mem_fun() 的替代解决方案也将受到赞赏。

以下是由于以下错误导致无法编译的代码:

没有匹配的函数调用“mem_fun()”。

需要注意的是,如果autoint 替换,则代码编译通过。此外,如果留下 auto ,但 template<int N><1> ,代码也可以编译并按预期工作。

class Q
{

public:
    int myq;

    template<int N>
    auto mymethod(int a)
        {
            std::cout << myq*a << std::endl;
        }
    void setint(int a)
        {
            myq = a;
        }
};


int main()
{

    boost::function<void (int)> p_member;
    Q q;
    p_member = std::bind1st(
        std::mem_fun(
            &Q::mymethod<1>
            ),
        &q
        );
    q.setint(1);
    p_member(100);
//...
}

【问题讨论】:

  • FWIW,被clang接受,用3.4.2测试,代码编辑为使用std::function而不是boost::function
  • 精确的编译器、构建标志和(所有)错误消息会有所帮助。
  • "需要注意的是,如果auto换成int,代码编译通过。"但是返回类型是void... ;-]
  • @ildjarn 漫长的一天...

标签: c++ templates auto c++14 member-function-pointers


【解决方案1】:

这并不是auto 所特有的,它是GCC 的一般限制。在某些情况下,它只是没有意识到,如果在指定模板参数之后只有一个可以引用的可能函数,它会引用该函数。对于大多数代码来说,这并不重要,对于大多数重要的情况,GCC 已经解决了这些限制,但有时它确实会浮出水面。不久前我报告了一个类似的问题:

template <int> void f() {}
int main() { return f<0> != f<0>; }

这应该比较f&lt;0&gt;的地址和f&lt;0&gt;的地址,所以应该返回零,但是GCC无法确定f&lt;0&gt;没有过载,并抱怨:

错误:“”和“”类型的无效操作数到二进制“operator!=”

在这里,一种解决方法是添加一个无意义的无操作,以说服编译器更加努力地找出类型:return &amp;f&lt;0&gt; != &amp;f&lt;0&gt;; 确实有效。

您的代码也可以使用类似的方法。尽管此处无法添加 &amp; 运算符,但其他无操作确实有效:

p_member = std::bind1st(
    std::mem_fun(
        true ? &Q::mymethod<1> : nullptr
        ),
    &q
    );

我认为没有理由认为您的代码可能无效。它被其他编译器接受(至少是clang),如果它是无效的,那么我的解决方法肯定会因为完全相同的原因而无效。

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多