小编Max*_*nyk的帖子

将朋友从模板导出到全局命名空间

有什么方法可以在没有前向声明的情况下将朋友从模板导出到全局命名空间?

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)

c++ templates

5
推荐指数
1
解决办法
127
查看次数

我在 Clang 和 GCC 中发现了错误吗?

主.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() 将 …

c++ gcc clang++

2
推荐指数
1
解决办法
80
查看次数

标签 统计

c++ ×2

clang++ ×1

gcc ×1

templates ×1