C++ 叮当声(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){} }; 模板结构

下面的代码使用gcc(g++)进行编译,但使用clang(c++)进行抱怨

我期待着一行
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.