使用指向常量c-string的指针在构造函数上编译错误

时间:2018-04-23 23:35:34

标签: c++ constructor compiler-errors most-vexing-parse

有人可以解释为什么我可以编译并运行这个

    T t1( T2( "TEST") );
    t1.print();

但不是这个

    const char * TEST_STRING = "TEST";
    T t1( T2( TEST_STRING ) );
    t1.print();

第二个街区显示

  

错误:请求't1'中的成员'print',这是非类型'T(T2)'

课程如下

class T2 {
public:
    T2( const char * str ) {
        m_str = str;
    }

    void test() const {
        cout << "t2 test" << m_str << endl;
    }
private:
    const char * m_str;
};

class T {
public:
    T( const T2 & t2 ) {
        t2.test();
    }

    void print() {
        cout << "t print " << endl;
    }
};

我的g ++版本是

  

g ++(Ubuntu 5.4.0-6ubuntu1~16.04.9)5.4.0 20160609

谢谢

1 个答案:

答案 0 :(得分:1)

感谢immibisRichard Crittenascheplerwiki

的所有评论

问题是因为

T t1( T2( TEST_STRING ) );

可以解释为

  1. 函数名t1的函数声明,它将T2作为参数并返回T
  2. 类T的t1的变量定义,用类T2的匿名实例初始化。
  3. 并将其解释为函数声明。

    来自aschepler

    的两个可能的干净修复
      

    另一种解决方法:T t1( static_cast<T2>( TEST_STRING ) );

         

    或者只是:T t1(( T2(TEST_STRING) ));(允许使用额外的括号   围绕一个声明器,但不是一个完整的函数参数,所以   不可能是一个函数声明。)