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

/* 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) {
                ^

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

最佳答案

应该

/* 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

关于c++ - 在函数签名中忽略部分特化非顶级 cv 限定符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24824138/

10-13 07:01