如何在另一个 cpp 文件中使用 const 对

How to use a const pair from one cpp file in another

我有 2 个结构:S 和 R。R 有一个 S 类型的实例。在 S 中定义了一个常量对,我也想在 R 中使用它,但出现以下错误。 S.hpp:11:12: 错误:‘const conf n1::n2::def1’的重新定义 11 | const conf def1 = std::make_pair(10, 2); | ^~~~

这些是结构体和主要函数

#include <string>
#include <iostream>
#include <utility>
#include <memory>

namespace n1
{
    namespace n2
    {
        typedef std::pair<uint32_t, uint32_t> conf;
        const conf def1 = std::make_pair(10, 2);
        const conf def2 = std::make_pair(20, 4);

        struct S
        {
            int x;
            inline void print();
        };
        using Sptr = std::shared_ptr<S>;
    }
}

#include "S.hpp"
namespace n1
{
    namespace n2
    {
        void S::print()
        {
            std::cout<<"S-print\n";
        }

    }
}

include "S.hpp"
#include <memory>

namespace n1
{
    namespace c1
    {
        struct R
        {
            R(n1::n2::Sptr s);
            void r();
            n1::n2::Sptr s_;

        };

    }
}

#include "R.hpp"

namespace n1
{
    namespace c1
    {
        R::R(n1::n2::Sptr s):s_(s){}

        void R::r()
        {
            n1::n2::conf c;
            std::cout<<"---s.first: " << c.first;
        }

    }
}

#include <iostream>
#include "R.cpp"
#include "S.cpp"
#include <memory>




int main()
{
    auto s = std::make_shared<n1::n2::S>();
    auto r = std::make_shared<n1::c1::R>(s);
    r->r();
    s.print();

    return 0;
}

我对你的程序进行了 3 处更改并编译通过:

变1

添加了 header 守卫。这是我的习惯(和建议),只要我在 header 中看不到,就添加 header 守卫。所以现在你的 header 看起来像:

S.hpp

 #ifndef S_H
 #define S_H
  #include <string>
    #include <iostream>
    #include <utility>
    #include <memory>
    
    namespace n1
    {
    namespace n2 
    {
    typedef std::pair<uint32_t, uint32_t> conf;
    const conf def1 = std::make_pair(10, 2);
    const conf def2 = std::make_pair(20, 4);
    
    struct S 
    {
        int x;
        inline void print();
    };
    using Sptr = std::shared_ptr<S>;
    }
    }
    
    #endif

R.hpp

#ifndef R_H 
#define R_H
#include "S.hpp"
    #include <memory>
    
    namespace n1 
    {
    namespace c1 
    {
    struct R 
    {
        R(n1::n2::Sptr s);
        void r();
        n1::n2::Sptr s_;
        
    };
    
    } 
    }
    #endif

变2

在 main.cpp 中,我已将 #include "R.cpp"#include "S.cpp" 分别更改为 #include "R.hpp"#include "S.hpp"。所以你的 main.cpp 现在看起来像:

main.cpp

#include <iostream>
#include "R.hpp"
#include "S.hpp"
#include <memory>

int main()
{
    auto s = std::make_shared<n1::n2::S>();
    auto r = std::make_shared<n1::c1::R>(s);
    r->r();
    //s.print();

    return 0;
}

变3

在 main.cpp 中注释我已经注释了我们的声明 s.print(); 因为 s 是没有打印方法的 shared_ptr 类型。

程序现在可以编译并给出输出 here