如何在另一个 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。
我有 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。