[英]'Use of class template requires template arguments' error with default specified non-type template parameter value
編譯這個:
#include <iostream>
#include <memory>
template <auto val = 42>
struct A
{
A()
{
std::cerr << val << "\n";
}
};
int main(int argc, const char* argv[])
{
std::shared_ptr<A> a_ptr {new A {}};
return 0;
}
給出error: use of class template 'A' requires template arguments
。 盡管我為非類型模板參數提供了一個默認值,並希望它以某種方式被編譯器看到和使用。 我在這里想念什么?
謝謝。
它仍然是一個模板,它仍然需要<
和>
:
std::shared_ptr<A<>> a_ptr {new A<> {}};
想想這個。 如果您有一個帶有默認參數的 function:
int foo(int baz=42);
你認為你可以簡單地調用它而不用括號嗎?
int foobar=foo;
當然不是,這行不通。 你仍然需要括號:
int foobar=foo();
與模板相同。
A
沒有命名class
,而是命名了 class 模板。
您需要使用A<>
來命名使用默認值的模板的實例化:
std::shared_ptr<A<>> a_ptr {new A<> {}};
// ^~~ here and ^~~ here
如果您在c++17或更高版本中,正如auto
模板參數所暗示的那樣,您可以從A
的構造中刪除<>
,因為這符合 CTAD 的條件,但在shared_ptr
的類型中仍然需要它
std::shared_ptr<A<>> a_ptr {new A {}};
// ^~~ only here
注意:這僅適用於類型沒有歧義的情況。 如果構造函數符合 CTAD 的條件,這將推導出一個(可能不同的)類型而不是A<>
例如,如果A
被定義為:
template <typename T = int>
struct A
{
A(){}
A(T x){}
};
然后:
std::shared_ptr<A<>> a_ptr {new A {}};
會成功,但是
std::shared_ptr<A<>> a_ptr {new A {0.1}};
會失敗,因為new A {0.1}
推導出A<double>
,但A<>
命名A<int>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.