在模板参数的方法中添加类型转换时出现clang错误

时间:2014-04-11 20:53:24

标签: c++ templates c++11 clang++

我有一个模板结构,它将方法的类型和指向方法的指针作为参数,并将其包装在类似C的函数中:

template <typename T, T> struct proxy;

template <typename T, typename R, typename ...Args, R (T::* mf)(Args...)>
struct proxy<R (T::*)(Args...), mf>
{
    static R call(T& obj, Args&&... args)
    {
        return (obj.*mf)(std::forward<Args>(args)...);
    }
};

代理结构符合预期的简单方案,例如:

struct Foo
{
    int foo(int x)
    {
        return x + 1;
    }
};

...
Foo f;
proxy<int(Foo::*)(int), &Foo::foo>::call(f, 10);

问题是当我在宏中使用 proxy 时可以展开:

proxy<decltype((int(Foo::*)(int))(&Foo::foo)), (int(Foo::*)(int))(&Foo::foo)>::call(f, 10);
clang 中的

,错误是:

error: non-type template argument is not a pointer to member constant
proxy<decltype((int(Foo::*)(int))(&Foo::foo)), (int(Foo::*)(int))(&Foo::foo)>::call(f, 10);
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

另一方面,GCC 4.8没有报告任何错误,一切都按预期工作。

我的问题是:

  1. 有没有办法解决clang的错误和
  2. 这是我应该报告的clang中的错误吗?

1 个答案:

答案 0 :(得分:1)

您的宏生成标准不合规代码。特别是,非类型方法指针模板参数中的强制转换不允许。在这种情况下,它也是多余的。

所以解决这个问题的最简单方法是更改​​宏:

#define WORKING_LUA_METHOD_FLAGS(name_, methodType_, methodPtr_, flags_) \
  ANKI_LUA_FUNCTION_AS_METHOD_FLAGS(name_, \
  (&proxy<methodType_, methodPtr_>::func), flags_)

在使用时:

ANKI_LUA_METHOD_FLAGS( "bob", (int(Foo::*)(int))(&Foo::foo), empty_flags )

变为:

WORKING_LUA_METHOD_FLAGS( "bob", int(Foo:::*)(int), &Foo::foo, empty_flags )

现在根据标准是正确的。注意"bob"empty_flags只是实际存在的占位符。替换名称可能需要也可能不需要。