有什么方法可以在没有前向声明的情况下将朋友从模板导出到全局命名空间?
template <typename T>
struct flags {
static_assert(std::is_enum_v<T>);
using base = std::underlying_type_t<T>;
friend T operator|(const T lhs, const T rhs) {
return T(base(lhs) | base(rhs));
}
};
enum class MyEnum {
A,
B
};
template struct flags<MyEnum>;
auto operator|(MyEnum, MyEnum) -> MyEnum; // (1)
MyEnum myEnum = MyEnum::A | MyEnum::B; //Not compile without (1)
Run Code Online (Sandbox Code Playgroud) 主.cpp:
#include <iostream>
struct Cls {
static void some_method() {
std::cout << __FILE__ << ": " << __LINE__ << std::endl;
}
};
extern void call_some_method();
void never_caled() {
Cls::some_method(); // (1)
}
int main() {
call_some_method();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
cls.cpp:
#include <iostream>
struct Cls {
static void some_method() {
std::cout << __FILE__ << ": " << __LINE__ << std::endl;
}
};
void call_some_method() {
Cls::some_method();
}
Run Code Online (Sandbox Code Playgroud)
当 (1) 被注释时, call_some_method() 将 "/home/maxim/CLionProjects/bug/cls.cpp: 5" 写入 std::cout。
当 (1) 未注释时, call_some_method() 将 …