我知道可以默認模板型別引數,但是,當我嘗試在std::vector不提供模板引數的情況下構造 a 時,這不起作用:
#include<vector>
template <typename Int = int>
struct integer{
Int i;
};
int main(){
integer num;
std::vector<integer> vec;
return 0;
}
此代碼回傳型別值不匹配(編譯器資源管理器鏈接)。是否可以在不寫的情況下解決此問題std::vector<integer<int>>
uj5u.com熱心網友回復:
如果您有一個帶有默認引數的函式:
int foo(int bar=0);
要呼叫此函式,您仍然必須撰寫:
int n=foo();
int n=foo;當然,嘗試寫作是行不通的。出于同樣的原因,如果您的模板引數是默認值,您仍然必須使用
integer<>
實體化模板而不是
integer
uj5u.com熱心網友回復:
您可以創建別名integer_t以interger<>使用using.
template <typename Int = int>
struct integer{
Int i;
};
using integer_t = integer<>;
int main(){
std::vector<integer_t> vec; // No error.
}
std::vector<integer>這個答案解釋了為什么不起作用的原因。
uj5u.com熱心網友回復:
您可以提供一個接受模板模板引數的包裝器(閱讀下文):
template <template <typename> class TT,
typename T = int>
using my_vector = std::vector<TT<T>>;
my_vector<integer> vec{}; // works
my_vector<integer, long> vecLong{}; // using non-default type
模板具有不同型別的模板引數:
引數串列中的每個引數可能是:
非型別模板引數;
型別模板引數;
模板模板引數。
template <typename>
struct with_type_parameter{};
template <template <typename> class>
struct with_template_template_parameter{};
所以,有一個明確的為你的編譯器之間的差異integer<>和integer。
- 第一個是從模板引數顯式實體化的型別。
- 第二個是模板 template。
因此,當您std::vector使用模板模板 integer而不是引數型別 實體化類模板時integer<>,您會得到錯誤。因為這兩件事對于類模板來說是不同的。
但是,函式模板有不同的行為,因為它們允許多載。
這是一個例子:https : //godbolt.org/z/cbnss17aj
template <typename>
struct with_typename{};
// can't have that. class template can only be specialized when declared
// template <template <typename> class>
// struct with_typename{};
#include <iostream>
template <typename>
void with_typename_fn()
{
std::cout << "type" << std::endl;
}
// perfectly fine, since function template overloading is allowed in C
template <template <typename> class>
void with_typename_fn()
{
std::cout << "template template" << std::endl;
}
template <typename>
struct non_defaulted{};
template <typename = int>
struct defaulted{};
int main()
{
with_typename_fn<int>(); // ok
with_typename_fn<non_defaulted>(); // also ok
with_typename_fn<defaulted>(); // also ok, but will resolve to template template specialization!
}
輸出:
type
template template
template template
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373620.html
標籤:C
上一篇:結構化系結中缺少型別資訊
下一篇:指標參考在C 中是如何作業的?
