簡體   English   中英

C++20 非類型模板參數,即先前類型參數中的模板:不是有效的模板參數,因為不是變量

[英]C++20 non-type template parameter which is template in the prior type parameters: is not a valid template arg, because is not a variable

我已經被這個問題難住了一段時間,並提煉了我的錯誤消息的一個簡單示例。 有什么方法可以使這項工作? 我只是在某處缺少“模板”或“類型名稱”嗎?

#include <cstdint>

template<typename T, typename J>
struct silly
{
    const void (*f)(T,J);
};

template<typename T, typename J, silly<T, J> aSilly>
struct sillier
{
    const uint32_t something;
};

void dumb_func(uint32_t i, uint32_t j)
{
    return;
}

constexpr silly<uint32_t, uint32_t> mySilly{ .f = dumb_func };

using silliest = sillier<uint32_t, uint32_t, mySilly>;

int main()
{
    return 2;
}

g++ 吐出:

g++ -std=c++2a ugh.cpp

ugh.cpp:20:51: error: invalid conversion from ‘void (*)(uint32_t, uint32_t)’ {aka ‘void (*)(unsigned int, unsigned int)’} to ‘const void (*)(unsigned int, unsigned int)’ [-fpermissive]
   20 | constexpr silly<uint32_t, uint32_t> mySilly{ .f = dumb_func };
      |                                                   ^~~~~~~~~
      |                                                   |
      |                                                   void (*)(uint32_t, uint32_t) {aka void (*)(unsigned int, unsigned int)}
ugh.cpp:20:51: error: ‘dumb_func’ is not a valid template argument of type ‘const void (*)(unsigned int, unsigned int)’ because ‘dumb_func’ is not a variable

我試過通讀https://en.cppreference.com/w/cpp/language/template_parameters但我在這里超出了我的模板深度。 實際用例是 T 和 J 類似於 std::array<float, ?> 然后 sillier<T, J,silly<T, J>> 繼承自其他一些更通用的類,並覆蓋了調用像 f 這樣的函數,這樣所有的東西都被內聯到了給定的傻<T,J> 實例的專用函數中。

編輯:

第三模板參數sillier是一個非類型模板參數,它只能被綁定到變量,但dumb_func不是變量。

這種解釋沒有意義,實際上代碼可能很好,並且錯誤可能只是此答案中發現和報告的錯誤 不過,下面給出的修復仍然有效。


您可以將第三個模板參數設為引用類型的非類型模板參數。

template<typename T, typename J, silly<T, J> const & aSilly>
                                          // ^^^^^^^
struct sillier
{
    const uint32_t something;
};

此外,成員變量fsilly被聲明為一個函數指針返回一個const void類型:

const void (*f)(T,J);

所以你要么需要從f的返回類型中刪除const ,要么你可以改變dumb_func的聲明以返回一個const void類型:

const void dumb_func(uint32_t i, uint32_t j)
{
    return;
}

const void返回函數似乎沒有任何意義,所以我會選擇第一個選項。


這是一個演示

暫無
暫無

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

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