[英]Is this explicit template function specialization of a member template of a member template of a class template valid?
有誰知道這種明確的專業化是否有效:
template <class>
struct L {
template <typename T>
struct O {
template <typename U>
static void Fun(U);
};
};
template<>
template<typename T>
template<typename U>
void L<int>::O<T>::Fun(U) {}
clang trunk(12/3/2013)給出以下錯誤:
f:... \\ test.cpp:36:20:錯誤:沒有定義的'O'類的'Fun'的外線定義
void L<int>::O<T>::Fun(U) {}
~~~~~~~~~~~~~~^
生成1個錯誤。
我們將非常感謝您提供標准的任何支持參考資料以證明您的答案。
注意:我有點驚訝它是一個錯誤 - 我希望能夠為任何模板參數系列選擇特化,其中'Fun'以<int><?any><?any>.
開頭實例化<int><?any><?any>.
這是一個鏗鏘的bug還是我期望的錯誤?
謝謝!
======編輯(我想我有答案)========
好的 - 我想我找到了支持措辭 - 來自N3797(后芝加哥2013年工作草案) - 14.7.3 / 16 =>
“在類模板成員或出現在命名空間作用域中的成員模板的顯式特化聲明中,成員模板及其某些封閉類模板可能保持非專業化,但聲明不應明確專門化類成員模板。它的封閉類模板也沒有明確專門化。“
如果我正確地解釋了這一點,如果我們要聲明其成員的顯式特化,我們需要O的顯式特化? 因此錯誤。
正確?
謝謝!
我不相信它是有效的。 我沒有足夠的語言來告訴你如何在不提供如下所述的頂級專業化的情況下完成此操作,或者如果有跳過復制模板的快捷方式,但錯誤消息相當清楚:您試圖提供依賴嵌套類型的靜態成員的實現,而不提供實際依賴項的特化。 即這是有效的:
#include <iostream>
template <typename>
struct L
{
template <typename T>
struct O
{
template <typename U>
static void Fun(U)
{
std::cout << "General: " << __PRETTY_FUNCTION__ << std::endl;
};
};
};
// provide specialized L
template<>
struct L<int>
{
template <typename T>
struct O
{
template <typename U>
static void Fun(U);
};
};
// L<int> is a specialized type, so provide the rest.
template<typename T>
template<typename U>
void L<int>::O<T>::Fun(U)
{
std::cout << "Special: " << __PRETTY_FUNCTION__ << std::endl;
}
int main()
{
L<int>::O<double> nobj;
nobj.Fun(10);
L<double>::O<int> nobj2;
nobj2.Fun(20);
return 0;
}
產量
Special: static void L<int>::O<double>::Fun(U) [T = double, U = int]
General: static void L<double>::O<int>::Fun(U) [T = int, U = int]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.