Lambda函数无法调用函数模板参数的静态函数

Lambda function failing to call static functions of a function template parameter

本文关键字:参数 静态函数 函数模板 调用 函数 Lambda      更新时间:2023-10-16

好的,我的设置基本上是这样的:

template<typename T> void example()
{
 std::function<int (byte*)> test = [=](byte* start) -> int
 {
  return T::magic(start);
 }
}

忽略这些裸调用有多"不干净",它也不会编译,给出以下错误:

'T' : is not a class or namespace name
'magic': identifier not found

是否有任何方法可以对泛型类型名T进行调用,假设我将始终使用具有函数magic(byte* start)的类调用example() ?当然,我不需要为每个将要这样做的类重新声明这个模板函数。

我在vc++ 2010中这样做,它似乎可能是一个编译器错误。有什么可行的变通办法吗?

唯一的错误是缺少分号。一旦这个问题解决了,它就可以正常工作了。

#include <iostream>
#include <functional>
typedef unsigned char byte;
template<typename T> void example()
{
    std::function<int (byte*)> test = [=](byte* start) -> int
    {
        return T::magic(start);
    }; // <--------------------------------- You were missing that
}
struct Foo {
    static int magic(byte*);
};
int Foo::magic(byte* start)
{
    std::cout << "magicn";
}
int main()
{
    example<Foo>();
}
http://ideone.com/dRdpI

由于这似乎是VC10的lambda实现中的一个错误,一个可能的解决方案是创建一个局部函函数类:

template<typename T> void example()
{
    struct Foo {
        int operator()(byte * start) { return T::magic(start); }
    };
    std::function<int (byte*)> test = Foo();    
}

我在VS2010中重现了这个问题。您需要调用example函数,但是:

#include <functional>
struct SomeT { static int magic(unsigned char*) { return 42; } };
template<typename T> void example()
{
    std::function<int (unsigned char*)> test = [=](unsigned char* start) -> int
    {
        return T::magic(start);
    };
}
int main()
{
    example<SomeT>();
}

根据OP的注释更新:

如此:

#include "stdafx.h"
#include <functional>
struct SomeT { static int magic(unsigned char*) { return 42; } };
template<typename T> void example()
{
    auto func = T::magic;
    std::function<int (unsigned char*)> test = [=](unsigned char* start) -> int
    {
        return func(start);
    };
}
int main()
{
    example<SomeT>();
}

我一直在寻找解决方案,但没有一个工作,我尝试了包括这个不错的排列,但没有运气:

template<typename T> void example()
{
    static const T* workaround;
    std::function<int (unsigned char*)> test = [=](unsigned char* start) -> int
    {
        typedef decltype(*workaround) innerT;
        return innerT::magic(start);
    };
}

这个很难…

我肯定你做错了什么,因为我能够调用一个静态方法使用语法T::f()内lambda:

#include <iostream>
#include <functional>
struct A
{
   static void f() { std::cout << "called" << std::endl; }
};
template<typename T> 
void example()
{
  std::function<void()> test = [=]() { T::f(); };
  test();
}
int main() {
        example<A>();
        return 0;
}

Demo: http://ideone.com/IPakS

所以请发布更多的信息。直到这就是答案。试着将您的代码与此代码进行比较,看看您是否做错了什么。

如果你使用GCC,你编译你的代码与-std=c++11选项?