簡體   English   中英

錯誤:沒有匹配的函數可以調用second :: second,候選者是:second :: second(

[英]error: no matching function for call to second::second, candidates are: second::second(

我需要根據模板化參數返回正確的類型。 我收到如下錯誤:有人可以建議解決方案嗎? 提前致謝。

error: no matching function for call to âsecond::second(const std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >&)â
note: candidates are: second::second(const std::string&, const std::string&)
note:                 second::second(const second&)

代碼如下:

struct first
{
public:
    const string &str;
    first(const string & str) : str(str)     {    }
};

struct second : public first
{
public:
    const string &str2;
    second(const string &str1, const string &str2) : first(str1), str2(str2)
    {    }
};

class base
{
public:
    template<class T>
    inline T fun(const string &s1, const string &s2);//     { cout<<" T = "<<a;    }
};

template<class T>
inline T  base::fun(const string &s1, const string &s2)
{
    if(1)
        return T(s1);
    else
        return T(s1, s2);
}


int main()
{
    string a = "a";
    string bb = "b";
    base b;
    b.fun<first>(a, bb);
    b.fun<second>(a, bb);
    return 0;
}

問題在於您無法創建始終接受固定類型的兩個參數並根據模板參數返回不同類型的對象的函數模板。 原因是您不能專門化模板函數,只能重載它們,並且不能使重載函數僅因返回類型而異。

您可以使用SFINAE進行操作 這樣,對於給定的模板參數,最多將存在一個功能:

class base {
public:
    template<typename T, typename = typename std::enable_if<std::is_same<T, first>::value>::type> 
    first fun(const string &s1, const string &s2) {
        return first(s1);
    }

    template<typename T, typename = typename std::enable_if<std::is_same<T, second>::value>::type> 
    second fun(const string &s1, const string &s2) {
        return second(s1, s2);
    }
};

或者,您可以使base模板化並對其進行專門化:

template<typename T> class base;

template<> class base<first> {
public:
    static first fun(const string &s1, const string &s2) {
        return first(s1);
    }
};

template<> class base<second> {
public:
    static second fun(const string &s1, const string &s2) {
        return second(s1, s2);
    }
};

base<first>::fun(a, bb);
base<second>::fun(a, bb);

演示

暫無
暫無

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

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