错误C2082:重新定义形式参数'tmp'

时间:2014-04-25 11:27:22

标签: c++ debugging constructor redefinition

场景是我有一个函数在我想初始化时调用参数化构造函数。所以我想做的就是在我想要的时候调用我选择的构造函数。但是当我使用A()来调用默认构造函数时,它可以工作,但它不能与带有参数的构造函数一起工作,而是我遇到了错误。

  

错误1错误C2082:重新定义形式参数   ' TMP' c:\ users \ adnan \ documents \ visual studio   2012 \ projects \ project3 \ project3 \ source.cpp 12 1 Project3

class A
{
public:
    int id;
    void i(int tmp)
    {
        A(tmp);
    }

    A()
    {
        cout<<"default const"<<endl;
    }

    A(int id)
    {
        this->id = id;
    }

};

int main()
{

    A obj[2];

    for(int i=0;i<2;i++)
    {
        obj[i].i(i*2);
    }

    cout<<"obj[0].id = "<<obj[0].id;
    cout<<endl;
    cout<<"obj[1].id = "<<obj[1].id;
    cout<<endl;


    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:3)

在您的会员功能i中,您试图像A这样打电话给<{1}}:

void i(int tmp)
{
    A(tmp);
}

实际上A(tmp)声明了tmp类型的变量A。由于tmp已在同一范围内声明为int,因此编译器会抱怨。

如果您想要一个A类型的变量并通过A::A(int) c&r;来初始化它,那么您需要为该变量命名。 E.g:

A a(tmp);

答案 1 :(得分:1)

该行

A(tmp);

不调用构造函数,它声明一个名为“tmp”的A实例 - 它相当于

A tmp;

由于形式参数被称为“tmp”,这是一个重新定义。

(尽管你可能期望,A tmp(); 等同于A tmp; - 寻找“最令人烦恼的解析”来了解更多信息。)

写作时“工作”的原因

A();

是它创建了一个匿名实例(与this完全不同的一个),它立即被丢弃。
换句话说,该代码没有按照您的想法执行。

除了使用“placement new”之外,没有办法(在C ++ 03中)显式调用构造函数,除非你知道你在做什么,否则不应该这样做。

如果要延迟对象的“初始化”,直到构造它为止,请使用初始化函数:

class A
{
public:
    int id;
    void init(int tmp)
    {
        id = tmp;
    }

    A()
    {
        cout<<"default const"<<endl;
        init(0); // Avoid accidental undefined behaviour.
    }

    A(int id)
    {
        init(id);
    }

};

答案 2 :(得分:0)

  

涉及表达式语句的语法含糊不清   和声明:

我引用了C ++标准。

就在这段代码中

void i(int tmp)
{
    A(tmp);
}

A(TMP);编译器将其视为等同于

的声明
A tmp;

将构造函数调用与您可以编写的声明区分开来

void i(int tmp)
{
    ( A )( tmp );
}

在这种情况下(A)(tmp)是一个构造函数调用,虽然在这个语句中没有任何意义。