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

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

假设我将始终使用具有magic(byte * start)函数的类来调用example(),有什么方法可以对通用类型名T进行调用?当然,我不必为将要执行此操作的每个类都重新声明此模板函数。

我正在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 << "magic\n";
}

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

10-05 20:48
查看更多