【问题标题】:How to call constructor if function has the same name如果函数具有相同的名称,如何调用构造函数
【发布时间】:2012-05-07 14:44:30
【问题描述】:

如果我有以下情况:

class T
{
   public: 
      T(){}
};

void T()
{
}

int main()
{
  T(); // this calls the function, how can I call the constructor T()?
}

我对它没有任何问题,因为我可以重命名它,但只是好奇如何强制它调用构造函数,而且我问自己为什么函数调用的优先级似乎高于构造函数。另外,为什么没有关于重复名称的警告消息。

【问题讨论】:

  • 简单,不要给他们相同的名字。或者不要在构造函数中使用括号。
  • @MooingDuck:“不要”虽然这是一个不错的建议,但它并没有回答问题。

标签: c++ constructor overload-resolution


【解决方案1】:

除了 jaunchopanza 所说的,您还可以对通话进行限定:

T::T();

使用此版本,您可以创建临时工:

class T
{
   public: 
      T(){}
};

void foo(T) {}

void T()
{
}

int main(){
   foo(T::T());
}

【讨论】:

  • 我不确定我的回答是否正确。该函数似乎掩盖了T 默认构造函数,至少在我的 gcc 4.8 快照中。
  • 顺便说一句,它会为你编译,如果是,用什么编译器?
  • @juanchopanza,它在 G++ 和 clang++(4.4.3 和 1.1,resp)中编译。奇怪的是,foo(T::T::T::T::T::T::T()); 也是如此
  • @juanchopanza 为 MSVS 和 ideone 编译。
  • 这不是一个格式良好的程序,根据 C++2003, 3.4.3.1/1a。 这样的构造函数名称只能在出现在类定义之外的构造函数定义的declarator-id 中使用。 请注意,本应失败的标准示例在 g++ 上编译成功。
【解决方案2】:

基本上没有名字冲突,基本上是在不同的命名空间里

T() ==> namespace::T() It;s a function call not an object instantiation. 
T a() ==> namespace ::T::T() It;s is instantiation of T class calling the constructor.
T a() ; a() ==>namespace ::T::T()::() It;s call the functor of the T Class (need to define the operator())    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多