内部结构在非命名空间作用域中的显式专用化
Explicit specialization _of an inner-struct_ in non-namespace scope
我知道有很多关于">非命名空间作用域中的显式专门化"的帖子;我已经读了其中的大部分,但(除非我没有很好地理解答案(他们没有回答这个特定的问题。事实上,我在我的程序中找到了一个变通方法,但我很想知道这个问题的"真正解决方案"(如果有的话(。
问题
请耐心听我说,这很难用语言表达。我有一个模板类A<typename T, unsigned n>
。我想将类型检查器定义为模板内部结构is_A<typename U>
,它检查U
是否是某个A
。此结构按原样继承自std::false_type
,并且我将其专门化为从std::true_type
派生模板类型A<U,n>
。
我为什么要这么做?因为我想定义一个模板方法A::method<U>
,它在U
是某个A
或其他情况下表现不同。
什么有效
- 将
is_a<U>
的非专业化定义置于A
的声明之前。然后用2个模板参数而不是1个来放置专门的版本ietemplate <> template <typename T, unsigned n> struct is_A< A<T,n> > : std::true_type {};
。为什么不呢,但我不太喜欢添加模板参数,分解is_A
的定义也不太好看 - 删除
is_A
并对method
使用另一个类型检查器,它精确地描述了我期望的类型(即,白名单方法而不是黑名单方法(
除了这些变通方法之外,还有其他方法可以写类似于下面标题的东西吗?
代码
这是我可以写的最小的标题来重现错误:
#ifndef __EXAMPLE__
#define __EXAMPLE__
#include <type_traits>
namespace name
{
template <typename T, unsigned n>
class A
{
public:
/**
* Type checkers
*/
template <typename U>
struct is_A : public std::false_type {};
template <> template <typename U>
struct is_A< A<U,n> > : public std::true_type {};
/**
* Specialized method
*/
// Version taking input of type A<U,n>
template <typename U>
void method( const A<U,n>& other ) {}
// Version taking inputs of other types
template <typename U,
typename = typename std::enable_if< !is_A<U>::value >::type >
void method( const U& x ) {}
};
}
#endif
以下是我编译包含以下标题的cpp文件时遇到的错误:
.h:21:12: error: explicit specialization in non-namespace scope 'class name::A<T, n>'
.h:30:7: error: too many template-parameter-lists
.h:35:7: error: too many template-parameter-lists
如果你按照编译器的建议去做,这似乎对我有用:去掉template<>
:
template <typename U>
struct is_A< A<U,n> > : public std::true_type {};
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 内部结构在非命名空间作用域中的显式专用化