函数签名中忽略了部分特化非顶级cv限定符

时间:2014-07-18 11:38:18

标签: c++

我正在尝试使用类似以下测试用例的内容:

/* Generic implementation */
template <typename T>
struct SpecWrapper {
   static void bar(T const* src) {
      printf("src[0] = %le\n", src[0]);
   }
}; 

/* Volatile partial-specialization */
template <typename T>
struct SpecWrapper<T volatile> {
   static void bar(T const* src) {
      printf("src[0] = %le\n", src[0]);
   }  
}; 

/* Instantiate */
void foo(double volatile const* src) {
   SpecWrapper<double volatile>::bar(src);
}

然而,这会导致g ++

出现以下错误
test.cxx: In function ‘void foo(const volatile double*)’:
test.cxx:18:38: error: invalid conversion from ‘const volatile double*’ to ‘const double*’ [-fpermissive]
    LowLevel<double volatile>::bar(src);
                                      ^
test.cxx:12:16: error:   initializing argument 1 of ‘static void LowLevel<volatile T>::bar(const T*) [with T = double]’ [-fpermissive]
    static void bar(T const* src) {
                ^

有人可以解释为什么会出现这个问题吗?我想到了一些解决方法,但我想首先理解为什么这是一个问题。

1 个答案:

答案 0 :(得分:2)

应该是

/* Volatile partial-specialization */
template <typename T>
struct SpecWrapper<T volatile> {
   static void bar(T volatile const* src) {
      printf("src[0] = %le\n", src[0]);
   }  
};

因为T只是double