我想为我的类型提供一个隐藏的朋友,同时在内联命名空间中还有另一个同名的对象。一切都适用于普通类型。
但是如果我有一个模板,当我实例化模板时编译器会出错
redefinition of 'cpo' as different kind of symbol
这是代码:
namespace lib{
struct CPO{
template<typename... T>
constexpr decltype(auto) operator()(T&&... args) const{
cpo(static_cast<T&&>(args)...);
}
};
inline namespace cpo_impl_{
inline constexpr CPO cpo{};
}
struct Foo1{
friend auto cpo(Foo1){
return 5;
}
};
template <typename T>
struct Foo2{
friend auto cpo(Foo2){
return 6;
}
};
}
int main(){
lib::Foo1 f1{};
lib::cpo(f1); // works fine;
lib::Foo2<int> f2{}; // error here
}
较小的例子在这里
namespace lib{
inline namespace impl_{
inline constexpr int foo = 5;
}
template <typename T>
struct Bar{
friend auto foo(Bar){
return 4;
}
};
}
int main(){
lib::bar<int> b{};
}
顺便说一句,我知道其他技术,例如tag_invoke
但在这里我无法控制名称和库