gpt4 book ai didi

c++ - 类模板的成员模板的成员模板的显式模板函数特化是否有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:13 24 4
gpt4 key购买 nike

有谁知道这个显式特化是否有效:

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 个错误。

我们将不胜感激标准中的任何支持性引用以证明您的回答是正确的!

注意:我有点惊讶这是一个错误 - 我希望为任何以 <int><?any><?any>. 开始实例化“Fun”的模板参数族选择特化

这是 clang 错误还是我预期的错误?

谢谢!

====== 编辑(我想我有答案了)========

好的 - 我想我找到了支持的措辞 - 来自 N3797(芝加哥 2013 年工作草案) - 14.7.3/16 =>

“在类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可以保持非特化,除非声明不显式特化类成员模板,如果它的封闭类模板也没有明确专门化的话。”

如果我解释正确,如果我们要声明其成员的显式特化,我们需要 O 的显式特化吗?因此错误。

正确吗?

谢谢!

最佳答案

我不认为这是有效的。我的语言不够深入,无法告诉您如何/是否可以在不提供如下所示的顶级特化的情况下执行此操作,或者是否有跳过复制模板的快捷方式,但错误消息非常清楚:您正在尝试提供依赖嵌套类型的静态成员的实现,而不提供实际依赖项的专门化。 IE。这有效:

#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]

关于c++ - 类模板的成员模板的成员模板的显式模板函数特化是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20363832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com