簡體   English   中英

模板類型的隱式轉換運算符不會自動確定

[英]Implicit conversion operator for templated types not automatically determined

我有一個模板類thing有一個隱含的轉換操作符,就像如下:

#include <stdio.h>

template <typename T>
struct thing
{
    T t;

    operator const T&() const 
    { 
        return t;
    }
};

template <typename T>
struct B 
{
    T t;
};

void fun(const int&) {
    printf("int\n");
}

template <typename T>
void fun(const B<T>&) {
    printf("B<T>\n");
}

int main()
{
    thing<int> a;
    fun(a);

    thing<B<int>> b;
    fun(b);

    return 0;
}

使用thing<int>調用fun(const int&) ,編譯器能夠找出調用隱式轉換運算符,以便將const T& (在本例中為const int& )傳遞給fun(const int&)

但是,對於一個thing<B<int>>thing<B<int>> ,編譯器無法弄清楚我希望調用fun(const B<T>&)

如何幫助編譯器解決這個問題而不bconst B<int>& explicitely(例如使用static_cast<const B<int>&>(b) )?

我的具體使用場景類似於我使用B約束的代碼,其中約有10種不同類型的T ,即不是任意多個不同的T s。 如果我必須創建~10個模板專業化,那就這樣吧。 但是,在這種情況下,我並不完全知道如何最好地重載struct B 但也許我走錯了路 - 可能存在更簡單/更優雅的解決方案嗎?

如何在不將bconst B<int>&情況下幫助編譯器解決這個問題?

你不能。 模板不進行任何隱式轉換。 他們推斷出參數的類型,即他們使用的類型。

你可以做的一件事就是給你的包裝器添加一個get函數

template <typename T>
struct thing
{
    T t;

    operator const T&() const 
    { 
        return t;
    }
    const T& get() const 
    { 
        return t; 
    }
};

然后你可以稱之為fun

fun(b.get());

模板參數推導不考慮隱式轉換。

類型推導不考慮隱式轉換(上面列出的類型調整除外):這是重載解析的工作,稍后會發生。

然后給予fun(b); ,模板fun無法調用,因為無法推斷出T

您可以顯式指定模板參數,然后重載解析和隱式轉換可以正常工作。

fun<int>(b);

生活

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM