首页 > 解决方案 > 在标头和源中分离类会导致构建错误

问题描述

下面的代码片段是有意简化的,只是为了说明问题。我想在这里展示两个案例。第一个将所有代码放在一个文件中,如下所示。

#include <iostream>

class Base
{
protected:
    double data;

public:
    Base(double data);
};

Base::Base(double data = 10) : data{data}{}


class Derived : public Base
{
};



int main()
{
    Derived d;
    std::cout<<"End of program";
    return 0;
}

到现在为止还挺好。一切都按预期工作。

但是,如果我将类拆分为它们的标题和源,如下所示。

基础.hpp

// Base.hpp
#pragma once
class Base
{
protected:
    double data;

public:
    Base(double data);
};

基数.cpp

// Base.cpp
#include "Base.hpp"

Base::Base(double data = 10) : data{data} {}

派生的.hpp

// Derived.hpp
#pragma once
#include "Base.hpp"

class Derived : public Base
{
};

派生的.cpp

// Derived.cpp
#include "Derived.hpp"

单独的.cpp

// separate.cpp
#include "Derived.hpp"
#include <iostream>

int main(){
    Derived d;
    std::cout<<"End of program";
    return 0;
}

我遇到了很多构建错误,如下所示。

> Executing task: C/C++: g++.exe build active file <

Starting build...
"C:\mingw32\bin\g++.exe" -g *.cpp -o separate.exe -I F:\StackExchange\Programming\VSCode-Template/cpp
separate.cpp: In function 'int main()':
separate.cpp:5:13: error: use of deleted function 'Derived::Derived()'
     Derived d;
             ^
In file included from separate.cpp:1:
Derived.hpp:4:7: note: 'Derived::Derived()' is implicitly deleted because the default definition would be ill-formed:
 class Derived : public Base
       ^~~~~~~
Derived.hpp:4:7: error: no matching function for call to 'Base::Base()'
In file included from Derived.hpp:2,
                 from separate.cpp:1:
Base.hpp:8:5: note: candidate: 'Base::Base(double)'
     Base(double data);
     ^~~~
Base.hpp:8:5: note:   candidate expects 1 argument, 0 provided
Base.hpp:2:7: note: candidate: 'constexpr Base::Base(const Base&)'
 class Base
       ^~~~
Base.hpp:2:7: note:   candidate expects 1 argument, 0 provided
Base.hpp:2:7: note: candidate: 'constexpr Base::Base(Base&&)'
Base.hpp:2:7: note:   candidate expects 1 argument, 0 provided

Build finished with error(s).
The terminal process terminated with exit code: -1.

问题

你能告诉我为什么会发生这个问题以及如何解决它吗?

标签: c++

解决方案


默认参数属于声明中(在标题中),而不是在定义中(在 .cpp 文件中)。


推荐阅读