簡體   English   中英

“使用 class 模板需要模板參數”錯誤,默認指定的非類型模板參數值

[英]'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

如果您在或更高版本中,正如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.

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