我想要对这种行为进行健全检查。
class myBase
{
public:
myBase();
virtual ~myBase() {};
myBase(const myBase& m) = default;
myBase& operator=(const myBase& m)= default;
myBase(myBase&& m)= default;
myBase& operator=(myBase&& m)= default;
virtual void ImplementMe() = 0;
void AnotherFunction();
private:
std::vector<SomeOtherClass> m_data;
};
class myDerived : public MyBase
{
public:
myDerived();
~MyDerived();
virtual void ImplementMe() override;
}
使用上面的场景,想象一下基类中的函数AnotherFunction(),它定义了一个for循环:
for(auto d : m_data)
我随便注意到循环正在复制。卫生署!所以我解决了。我们也没有改变它,所以我把它变成了常量。
for(const auto& d : m_data)
突然,我的应用程序由LibraryOne.a和Library2.a中的一个可执行文件链接组成,无法链接。对for循环的更改是唯一的变化。链接错误是残暴的,但我推断我已经从libraryOne.a中删除了所有复制构造函数的使用,因此编译器将其剥离。 &#34; =默认&#34;创建内联构造函数,从我理解的内容函数可以删除未使用的内联函数。当应用程序转到链接时,Library2.a不再找到基类的复制构造函数并失败。
我通过使用其余的类定义在.cpp文件中定义构造函数来解决问题。
这是解决问题的正确方法吗?是否有一种可移植的方式告诉编译器不要抛弃默认的构造函数,因为类可能会从另一个库中继承它?
我在ubuntu上使用GCC 5.3.1。
$ gcc --version
gcc (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
最终导致链接订单错误。这是我对gnu链接器的理解(如果我错了,你可以再次纠正我。)
链接器在链接步骤中从左到右处理静态库。在我的例子中,它首先遇到了libraryone.a,并删除了构造函数,因为它们没有在库中使用。然后它命中了需要它们的library2.a,我得到了未解析的符号。
当我首先放置library2.a时,链接器将记录未解析的符号,当它遇到时,然后在libraryone.a中它不会删除它们。
现在我认为这是问题所在。我做了一个简单的改变,链接器说,&#34; nope,不再需要这些&#34;我得到了错误。
当我意识到发生了什么时,我正在整理一个例子。