【问题标题】:Why am I getting this 'redeclared as different kind of symbol' error?为什么我会收到“重新声明为不同类型的符号”错误?
【发布时间】:2012-10-08 05:54:37
【问题描述】:

我有一个这样的函子,

class PrintParentheses
{
public:
    PrintParentheses(unsigned pairsCount)
    {}

    void operator ()() {}
};

main()里面我是这样用的,

#include <iostream>

int main()
{
  unsigned pairsCount = 0;

  // Error:  ‘PrintParentheses pairsCount()’ redeclared as different kind of symbol
  PrintParentheses(pairsCount)();

  PrintParentheses(5)(); // But this works

}

错误位置标记在代码本身内部。我已经测试了GCC-4.6clang-3.1。两者都给出相同的错误。

【问题讨论】:

  • PrintParentheses(pairsCount)();pairsCount 声明为返回PrintParentheses 的函数。我知道这已经被问过好几次了,但我找不到它。
  • @hvd,没见过这么问的。语法与正常情况不同。我不得不说添加的括号一开始就给我留下了深刻的印象。
  • @chris 也许你是对的,导致混淆的更常见的语法是T1 x(T2()),而不是T1(x)(),即使根本问题是相同的。
  • @hvd,如果我从 SO 中学到了一件事,那就是可以用多种不同的方式提出同一个问题。在尝试显式调用默认构造函数时,我经常看到Class obj();
  • 我冒昧地简化了代码。通常,您应该尝试提供可以轻松重现问题的简短代码示例。你原来的很多代码都是无关紧要的。

标签: c++ functor


【解决方案1】:

这被解读为 pairsCount 是一个不带参数并返回 PrintParentheses 的函数。由于被称为“最令人烦恼的解析”,因此必须将其视为函数声明。相反,创建一个对象并使用它:

PrintParentheses obj(pairsCount);
obj();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多