簡體   English   中英

C++ 函數模板全特化錯誤

[英]C++ function template full specialization error

我有這個模板匹配錯誤。 我知道函數模板中不允許部分專業化,但我認為它應該與完全專業化一起使用。 我需要做哪些改變來解決這個問題? 謝謝。

#include <iostream>

template<typename T>
void allocate(){
    std::cout << "default" << std::endl;
}

template<>
void allocate<int>() {
    std::cout << "int" << std::endl;
}

template<>
void allocate<double>() {
    std::cout << "double" << std::endl;    
}




int main()
{
    allocate();  // Compiler error, I expect this should match the first template function.
    allocate<int>();
    allocate<double>();
    
    return 0;
}

您需要明確指定模板參數,模板參數T不能從上下文中推導出來。 例如

allocate<void>();

或者為模板參數指定默認參數,例如

template<typename T = void>
void allocate(){
    std::cout << "default" << std::endl;
}

那么你可以稱之為

allocate(); // T is void

主模板需要顯式指定模板參數,因此您可以執行以下操作:

allocate<struct T>();  // ok

並且由於T是一個新類型,僅為了此調用的目的而命名,因此保證不會對此類型進行特化,並且將調用主模板。


您還可以為主要中的模板參數提供默認類型:

template<typename T = struct Default>
void allocate(){
    std::cout << "default" << std::endl;
}

同樣, Default不存在特化,因為這種類型只存在於主模板的范圍內。

現在您可以在沒有模板參數的情況下調用主模板:

allocate();

暫無
暫無

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

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