我正在尝试使用类似以下测试用例的内容:
/* 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/