C++本地类作为函数对象

7

我尝试将本地类作为函数对象使用,在使用g++(3.4.6)时出现编译器错误。

将下面的类(Processor)放在全局范围内解决了该错误,因此我猜测是因为函数局部结构/类导致的错误。我希望将类放在函数内以便于代码清晰和使用方便。想知道是否有解决方法使得下面的代码能够正常工作。

test.cpp:24: error: no matching function for call to \u2018foreachArg(int&, char*&, processSubs(int, char*)::Processor&)\u2019

template <class Functor>
void foreachArg(int n, char *args[], Functor& f)
{
    for(int i=0; i<n; ++i)
        f(args[i]);
}

int processSubs(int argc, char *args[])
{
    class Processor
    {
        public:
            void operator()(const char *arg)
            {
            }
    };

    Processor p;
    foreachArg(argc, args, p);
}

int main(int argc, char *argv[])
{
    processSubs(argc, argv);
}

不,这两个选项是使用兼容C++11的编译器,或将类移出函数。 - Bo Persson
请参考以下链接:https://dev59.com/tk3Sa4cB1Zd3GeqPrwx5#2598272,了解关于匿名结构体作为模板参数的C++11规范之前的相关信息。 - Akanksh
有第三个选择 - 使用“本地”函数对象惯用语。例如,Boost正在添加一个。 - Luis Machuca
4个回答

9

在C++11之前,作为模板函数参数的类必须具有外部链接。局部类没有外部链接,因此无法以这种方式使用。

C++11对此进行了更改,因此您可以通过将编译器设置为使用C++11来解决此问题。


不幸的是,我使用的编译器(3.4.6——停留在石器时代:P)不支持c++0x,因此正在寻找聪明的解决方法。 - Shanky
没有真正的解决方法。一些编译器在C++11之前有扩展来允许这样做,但据我所知,gcc不支持。如果你被困在当前的编译器中,我认为没有比将函数对象移出本地作用域更好的选择了。@Shanky - bames53
实际上有一些解决方法。不确定它是否适用于GCC 3.x,但在GCC 4.2和4.4中,我使用了一个非常简单的“LOCAL_FUNCTION”习语,基于继承和模板特化,将实际函数调用委托给外部基础函数器,这些函数器虚拟转发到本地函数器。Boost似乎最近推出了类似的东西(并且像往常一样,更好,但具有巨大的复杂性和依赖成本)。 - Luis Machuca

0

在C++03中,您无法使用本地类实例化模板。

此外,标准已经提供了一个函数-std::for_each来解决这个问题。


0

C++03不允许在模板参数中使用本地定义的类,正如您在这里发现的那样。C++11允许这样做。对于gcc编译器,您可以尝试使用--std=c++0x进行编译。


不幸的是,我使用的编译器(3.4.6——停留在石器时代:P)不支持c++0x,因此正在寻找聪明的解决方法。 - Shanky

0
正如已经说过的,使用本地类在C++11之前是不可能的,而且在C++11中几乎没有用,因为lambda表达式更简洁。
你应该简单地在函数外部声明你的类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接