[英]c++ implicit conversion on user-defined operator for template classes
我有一個結構模板A<x>
和一個帶有int
的+
運算符。
#include <iostream>
template<int x>
struct A{
int a;
};
template<int x>
int operator+(A<x> a, int b){
return a.a+b;
}
我創建了一個結構模板B<x>
,它可以轉換為A<x>
。
template<int x>
struct B{
int b=3;
operator A<x>(){
return {b+10};
}
};
現在我想B<x>
轉換為A<x>
呼叫時B<x> + int
。
int main(){
std::cout<<(A<12>{9}+10)<<std::endl;//OK
std::cout<<(B<12>{9}+10)<<std::endl;//Error
return 0;
}
我在重載模板類的運算符時讀取了隱式轉換並寫了
template<int x>
struct B{
int b=3;
operator A<x>(){
return {b+10};
}
friend int operator+(A<x> a, int b);
};
,但它不起作用,因為聲明的friend int operator+(A<x> a, int b)
與template<int x> int operator+(A<x> a, int b)
friend int operator+(A<x> a, int b)
不匹配。
我讀了C ++ - 如何為類模板聲明一個函數模板的朋友並制作好友聲明模板,但它不起作用,因為無法推導出模板參數。
當然我可以為A和B編寫operator +,但我有幾十個運算符,我不想這樣做。
這樣做的正確方法是什么?
看看為A
創建一個非成員operator+
的兩種方法,我們可以將它作為一個函數模板:
template <int x>
int operator+(A<x>, int);
這與B<x>
不匹配,因為我們只是進行模板推導,不允許進行轉換。
或者,我們可以使它成為非模板的朋友:
template <int x>
struct A {
friend int operator+(A a, int );
};
它也不會與B<x>
匹配,因為名稱查找不會考慮該函數。 除非,即我們告訴它:
template <int x>
struct B {
friend int operator+(A<x>, int ); // NB: not a template
};
現在 ,將考慮我們的原始非模板operator+
將根據需要執行轉換,並且您的代碼打印29。
您可能已經看過這個,但至少仍然可以進行顯式轉換,它可能很有用:
int main(){
std::cout<<(A<12>{9}+10)<<std::endl; // prints 19
std::cout<<(static_cast<A<12>>(B<12>{9})+10)<<std::endl; // prints 29
return 0;
}
我希望它可以幫助你。
我有模板化的朋友operator+
派生自A<x>
並編譯,但在調用friend operator+
變量后, a
是uninit所以我得到了立即值。 你必須設置a
不知何故,這似乎工作。
#include <iostream>
template<int x>
struct A
{
int a{x};
};
template<int x>
int operator+(A<x> a, int b)
{
return a.a+b;
}
template<int x>
struct B : A<x>
{
int b;
template<int U>
friend int operator+(A<U> a, int b);
};
int main(void)
{
std::cout<< (A<20>{}+10)<<std::endl; // prints 30
std::cout<< (B<10>{}+10)<<std::endl; // prints 20
return 0;
}
我嘗試使用以下(runnable)代碼編輯Barrys回答,這會生成正確的輸出,但在那里被拒絕了。
我會在這里添加它以防萬一其他人好奇。
#include <iostream>
template <int x>
struct A {
int a;
friend int operator+(A a, int b) { return a.a + b; }
};
template <int x>
struct B {
int b;
operator A<x>() { return {b+10}; }
friend int operator+(A<x>, int );
};
int main() {
std::cout << (A<12>{9} + 10) << std::endl;
std::cout << (B<12>{9} + 10) << std::endl;
}
哪個打印
19
29
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.