Foo1.hpp:
#pragma once
#include <string>
enum class Foo1 {
A, B, C
};
// Commented out to avoid compiler error
//inline Foo1 fFromStr(const std::string& a) {
// if (a == "A") return Foo1::A;
// if (a == "B") return Foo1::B;
// else return Foo1::C;
//}
inline std::string fToStr(const Foo1 a) {
switch (a) {
case Foo1::A: return "A";
case Foo1::B: return "B";
default : return "C";
}
}
Foo2.hpp:
#pragma once
#include <string>
enum class Foo2 {
A, B, C
};
// Commented out to avoid compiler error
//inline Foo2 fFromStr(const std::string& a) {
// if (a == "A") return Foo2::A;
// if (a == "B") return Foo2::B;
// else return Foo2::C;
//}
inline std::string fToStr(const Foo2 a) {
switch (a) {
case Foo2::A: return "A";
case Foo2::B: return "B";
default : return "C";
}
}
main.cpp:
#include "Foo1.hpp"
#include "Foo2.hpp"
int main() {
fToStr(Foo1::A);
//fFromStr("A");
fToStr(Foo2::A);
//fFromStr("A");
return 0;
}
根据我在网上读到的内容,两个全局内联函数必须有唯一的名称,以避免未定义的行为。我相信未定义的行为来自链接器任意选择其中一个函数并删除另一个函数
在上面的代码中,两个fFromStr
会导致编译器错误,因为它们是二义性的:
In file included from main.cpp:2:
Foo2.hpp:9:13: error: ambiguating new declaration of 'Foo2 fFromStr(const string&)'
9 | inline Foo2 fFromStr(const std::string& a) {
| ^~~~~~~~
In file included from main.cpp:1:
Foo1.hpp:9:13: note: old declaration 'Foo1 fFromStr(const string&)'
9 | inline Foo1 fFromStr(const std::string& a) {
|
但是,fToStr
不会导致编译器错误,因为使用它需要指定Foo1
或Foo2
我的问题是,这两个fToStr
是否会导致未定义的行为,或者它们的类型要求是否避免了问题
1条答案
按热度按时间bq3bfh9z1#
这两个fToStr是否导致未定义的行为,或者它们的类型要求是否避免了问题
这些都是普通的重载函数。他们没有任何问题。