使用 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 编译失败