簡體   English   中英

模板化類的模板化構造函數的顯式模板特化

[英]Explicit template specialization for templated constructor of templated class

這個問題可能與這個問題重疊: 模板化類的模板化構造函數的C ++顯式模板特化 但是,我沒有在該線程中找到解決方案。

我有一個帶有模板化構造函數的模板化類:

template<typename First, typename ... Rest> class var {
    public:
        template<typename T> var(T& t) {
            std::cout << "general" << std::endl;
        }
};

但是如果這個類被實例化為與參數相同的類的對象(即,我們想要調用copy-(或move-)構造函數),應該做一些特定的事情。 所以我嘗試了以下方法:

template<typename First, typename ... Rest> template<> 
var<First, Rest...>::var(var<First, Rest...>& v) {
    std::cout << "copy" << std::endl;
}

當嘗試用g ++ 4.6編譯它時,我得到錯誤:'>'令牌錯誤之前的無效顯式特化:封閉類模板沒有明確地被早期錯誤專門混淆,拯救

我看到了問題,我必須明確說明我想將哪個類專門化構造函數...

但是,我希望我明白我想做什么。 有什么想法?

模板構造函數不是復制構造函數:

template<typename First, typename ... Rest> class var {
    public:
    var() {};
    var(const var& v) {
        std::cout << "copy" << std::endl;
    }
    template<typename T>
    var(const T& t) {
        std::cout << "general" << std::endl;
    }
};

int main()
{
    var<int> i0;
    var<int> i1(i0);
    var<int> i2("Hello");
}

copy
general

注意:添加了一些const

您將非復制構造函數專門化為復制構造函數的嘗試失敗。

12.8:

如果X類的第一個參數是X&,const X&,volatile X&或const volatile X&,並且沒有其他參數或者所有其他參數都有默認參數,則類X的非模板構造函數是一個復制構造函數(8.3.6) )。

如果沒有完全專門化這個類,你就無法專門化模板化方法。 它被C ++標准禁止。

典型的解決方法是功能/方法超載,正如DieterLücking在他的回答中所示。

也在這里回答

暫無
暫無

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

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