C++ 叮当声(c+;+;)可以';在专门化中找不到名称
下面的代码使用gcc(g++)进行编译,但使用clang(c++)进行抱怨 我期待着一行C++ 叮当声(c+;+;)可以';在专门化中找不到名称,c++,templates,template-specialization,C++,Templates,Template Specialization,下面的代码使用gcc(g++)进行编译,但使用clang(c++)进行抱怨 我期待着一行n1::generic(*it)查找my_traits(或my_traits)专业化,但它似乎是从同一专业化中查找向量(const?)中的特定名称 而且,这是布尔特有的。其他类型(如int)工作正常。(我尝试添加了一个my_traits(以及const bool)专门化,但没有效果) #包括 名称空间n1{ 模板结构my_traits{}; 模板结构我的特征{ 静态空洞特定(bool b){} }; 模板结构
n1::generic(*it)
查找my_traits
(或my_traits
)专业化,但它似乎是从同一专业化中查找向量(const?)中的特定名称
而且,这是布尔特有的。其他类型(如int)工作正常。(我尝试添加了一个my_traits
(以及const bool)专门化,但没有效果)
#包括
名称空间n1{
模板结构my_traits{};
模板结构我的特征{
静态空洞特定(bool b){}
};
模板结构我的特征{
静态空洞特定(int b){}
};
模板无效通用(常量T&T)
{
我的特征:特异性(t);
}
模板结构我的特征{
静态空隙特定(常数标准::向量和b)
{
如果(!b.empty()){
对于(typename std::vector::const_迭代器it=b.begin();
it!=b.end();+it){
n1::通用(*it);
}
}
}
};
}
命名空间n2{
结构ArrayOfBoolean{
std::向量值;
};
结构ArrayOfInt{
std::向量值;
};
}
名称空间n1{
模板结构我的特征{
静态空隙率(常数n2::ArrayOfBoolean&v){
n1:通用(v.值);
}
};
模板结构我的特征{
静态空隙特定(常数n2::ArrayOfInt&v){
n1:通用(v.值);
}
};
}
c++codec.cc-o编解码器
在codec.cc:1:./codec.h:17:23包含的文件中:错误:在“n1::my_traits”中没有名为“specific”的成员
我的特征:特异性(t);
~~~~~~~~~~~~~~^
./codec.h:26:25:注意:在函数模板专门化的实例化中,此处请求“n1::generic”
n1::通用(*it);
^
./codec.h:17:23:注意:在成员函数“n1::my_traits::specific”的实例化中,此处请求
我的特征:特异性(t);
^
./codec.h:47:17:注意:在函数模板专门化的实例化中,此处请求“n1::generic”
n1:通用(v.值);
^
生成1个错误。
看起来很奇怪,向量不包含任何bool
s。只有您无法获得真正引用的位
所以在n1::generic(*it)中
没有常量bool&
,只有位常量引用
代理类。这是因为不幸的std::vector
专门化是好的文章向量。
#include <vector>
namespace n1 {
template <class T> struct my_traits { };
template <> struct my_traits<bool> {
static void specific(bool b) { }
};
template <> struct my_traits<int> {
static void specific(int b) { }
};
template <typename T> void generic(const T& t)
{
my_traits<T>::specific(t);
}
template <typename T> struct my_traits<std::vector<T> > {
static void specific(const std::vector<T>& b)
{
if (! b.empty()) {
for (typename std::vector<T>::const_iterator it = b.begin();
it != b.end(); ++it) {
n1::generic(*it);
}
}
}
};
}
namespace n2 {
struct ArrayOfBoolean {
std::vector<bool> values;
};
struct ArrayOfInt {
std::vector<int> values;
};
}
namespace n1 {
template<> struct my_traits<n2::ArrayOfBoolean> {
static void specific(const n2::ArrayOfBoolean& v) {
n1::generic(v.values);
}
};
template<> struct my_traits<n2::ArrayOfInt> {
static void specific(const n2::ArrayOfInt& v) {
n1::generic(v.values);
}
};
}
c++ codec.cc -o codec
In file included from codec.cc:1:./codec.h:17:23: error: no member named 'specific' in 'n1::my_traits<std::__1::__bit_const_reference<std::__1::vector<bool,std::__1::allocator<bool> > > >'
my_traits<T>::specific(t);
~~~~~~~~~~~~~~^
./codec.h:26:25: note: in instantiation of function template specialization 'n1::generic<std::__1::__bit_const_reference<std::__1::vector<bool, std::__1::allocator<bool> > > >' requested here
n1::generic(*it);
^
./codec.h:17:23: note: in instantiation of member function 'n1::my_traits<std::__1::vector<bool, std::__1::allocator<bool> > >::specific' requested here
my_traits<T>::specific(t);
^
./codec.h:47:17: note: in instantiation of function template specialization 'n1::generic<std::__1::vector<bool, std::__1::allocator<bool> > >' requested here
n1::generic(v.values);
^
1 error generated.