使用 gcc 编译失败,但使用 msc++ 编译成功

Posted

技术标签:

【中文标题】使用 gcc 编译失败,但使用 msc++ 编译成功【英文标题】:compile failed with gcc but success with msc++ 【发布时间】:2020-11-13 10:26:19 【问题描述】:

我用gcc编译,版本是(Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 in Ubuntu 18.0.4 64 bits。 下面的代码可以用 msvc++ 2015 编译成功,但是用 gcc 编译失败。


class BaseClass

;

template <typename T>
class CPIPtr

public:
    CPIPtr()
    
        _p = nullptr;
    

    CPIPtr(const CPIPtr& item)
    
        _p = nullptr;
        *this = item;
    

    CPIPtr(BaseClass* pI)
    
        _p = nullptr;
    

    ~CPIPtr()
    
    

    operator T* () const
    
        return _p;
    

    T* operator=(BaseClass* pI)
    

        return _p;
    

private:
// public:
    T* _p;
;

#define GF_DEFINE_INTERFACE_REF_PTR(x) \
   typedef CPIPtr<x> x ## Ptr

class ITest : public BaseClass
;

GF_DEFINE_INTERFACE_REF_PTR(ITest);

class ITest1 : public BaseClass
;

GF_DEFINE_INTERFACE_REF_PTR(ITest1);

int main()

#if 0
    ITestPtr test;
    ITest1Ptr test1;

    ITest1Ptr test1 = test;
    // the above line code is equal the below two lines with msvc++
    ITest* pTest = test.operator ITest *();
    Test1.operator=(pTest);
    
#endif//0

    ITestPtr test;
    ITest1Ptr test1 = test;
    test = test1;

    return 0;

使用 gcc 编译器,出现以下错误。 错误:请求从“CPIPtr”转换为非标量类型“CPIPtr”。

我该如何解决这个问题? 提前致谢。

【问题讨论】:

在我的项目中,我想在不同的 Ptr 对象中使用赋值运算符。 operator T* 和 operator=(BaseClass* pI) 可以帮助完成这项工作。 旧的 MSVC++ 是出了名的不符合标准,在 2019 年尝试相同,看看它是否不像 gcc 那样抱怨。 亲爱的冲浪者,我刚才用msvc++2019(v142)测试了代码,可以编译成功。相反,我认为这是 gcc 的错。 gcc 不够聪明。 【参考方案1】:

使用

ITest1Ptr test1test;

Demo

【讨论】:

非常感谢。但是 Itest1Ptr(test) 会调用构造函数。它不等于 test1 = test。 ITest1Ptr test1test; 使用复制构造函数,而不是赋值。【参考方案2】:

问题出在一线,

ITest1Ptr test1 = test; 

这将调用复制构造函数,但在此之前它类型转换失败,而是使用,

ITest1Ptr test1 = static_cast<ITest1Ptr>(test);

或者,

ITest1Ptr test1 (test);

下面这行是调用赋值运算符,没关系,

test = test1;

【讨论】:

我想如果vc++找不到合适的构造函数,那就继续找其他的成员函数完成编译,但是gcc找不到合适的构造函数就报错了。

以上是关于使用 gcc 编译失败,但使用 msc++ 编译成功的主要内容,如果未能解决你的问题,请参考以下文章

使用 clang 5.0.1/6.0.0 编译成功,使用 5.0.2/6.0.1 编译失败

使用 Makefile 编译失败但在命令行中成功

多gcc版本环境下 CMake 编译失败

如何打包静态库文件

ZeroMQ 编译在 Windows 上使用 gcc/g++ 失败

编译汇编链接加载