类模板成员模板的成员模板的显式模板函数专用化有效吗
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(2013年3月12日)给出以下错误:
f: 。。。\test.cpp:36:20:error:没有定义的类"O"中"Fun"的定义越界
void L<int>::O<T>::Fun(U) {}
~~~~~~~~~~~~~~^
生成1个错误。
任何来自该标准的证明你的答案的参考资料都将不胜感激!
注意:我有点惊讶,这是一个错误-我希望为任何从<int><?any><?any>.
开始实例化"Fun"的模板参数族选择专门化
这是一个叮当作响的bug还是我期望中的bug?
谢谢!
======编辑(我想我有答案了)===
好的-我想我找到了支持性的措辞-来自N3797(芝加哥后2013年工作草案)-14.73/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]
相关文章:
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 有效地初始化 const std::vector 类成员
- 在C 中实现基于模板的可选类成员的最有效方法
- 如何有效地将浮点数别名为数组的命名成员和元素
- 相对于向量对象的两个成员,找到两个向量的相交的有效方法
- 使用大型数据集初始化类成员向量的最有效方法
- 类模板的成员函数有条件无效(隐式实例化有效;显式实例化失败)
- 为什么仅在返回通用类中的自定义类型时才有效constexpr成员函数
- 模板化类的模板化成员编译失败.VC++ 有效,但 G++ 失败
- 具有未初始化成员的结构的constexpr默认构造函数仅在模板化时有效
- 使用相同的参数名称和成员名称是否有效
- 类模板成员模板的成员模板的显式模板函数专用化有效吗
- 将没有成员的函子设置为类成员对象还是堆栈对象更有效
- 智能感知说错误:成员"Class::field"无法访问,但它仍然有效?为什么?
- 为类中有效的成员变量提供初始值
- 在派生类构造函数中复制继承的成员有效吗
- 返回+重置成员变量的最有效方法
- 在C++03中,在未赋值的上下文中使用表示非静态数据成员的id表达式有效吗
- 使用数组作为元组成员:有效的C++11元组声明