C++ 编译器选择了无效的模板专门化并失败
下面的代码是我正在处理的代码库的一个片段。理想情况下,库用户可以部分指定C++ 编译器选择了无效的模板专门化并失败,c++,templates,C++,Templates,下面的代码是我正在处理的代码库的一个片段。理想情况下,库用户可以部分指定Fixed类型,假设他们希望在整个代码中使用相同的backing整数和精度(FixedBase值只有在具有相同backing值时才具有可比性) 令人惊讶的是,它没有编译。main中的实例化选择第一个模板,然后失败,因为11不是一个类型。。。尽管存在有效的专业化 #include <cstdint> /******** Library code *********/ template<typename v
Fixed
类型,假设他们希望在整个代码中使用相同的backing整数和精度(FixedBase
值只有在具有相同backing值时才具有可比性)
令人惊讶的是,它没有编译。main
中的实例化选择第一个模板,然后失败,因为11
不是一个类型。。。尽管存在有效的专业化
#include <cstdint>
/******** Library code *********/
template<typename value_t, std::size_t MAX_PREC>
class FixedBase {};
template<typename value_t, std::size_t MAX_PREC, int L, int R>
class Fixed : public FixedBase<value_t, MAX_PREC> {};
/********* User code **********/
// User specialization
template<int L, int R>
class Fixed<int64_t, 64, L, R> {};
int main(void) {
Fixed<11, -3> a;
return 0;
}
#包括
/********库代码*********/
模板
类FixedBase{};
模板
类Fixed:public FixedBase{};
/*********用户代码**********/
//用户专业化
模板
类固定{};
内部主(空){
固定一个;
返回0;
}
主要的问题是,为什么它选择了第一个专业却失败了,而不是选择了有效的第二个专业?如何让编译器选择正确的编译器
第二个问题是,是否有更好的方法部分指定模板参数?我想可能有一些特殊的,使用了我不熟悉的语法,在谷歌搜索时也没有发现。你误解了专门化的工作原理,专门化不会改变模板参数列表
在这种情况下,可以使用别名:
template<int L, int R>
using my_type = Fixed<int64_t, 64, L, R>;
int main(void) {
my_type<11, -3> a;
return 0;
}
模板
使用my_类型=固定;
内部主(空){
我的母亲是a型;
返回0;
}
您误解了专门化的工作原理,专门化不会更改模板参数列表
在这种情况下,可以使用别名:
template<int L, int R>
using my_type = Fixed<int64_t, 64, L, R>;
int main(void) {
my_type<11, -3> a;
return 0;
}
模板
使用my_类型=固定;
内部主(空){
我的母亲是a型;
返回0;
}
当您添加部分专门化时,如
template<int L, int R>
class Fixed<int64_t, 64, L, R> {};
然后应该使用专门化,因为前两个参数匹配
长话短说:您始终必须指定所有主模板成员。当您添加部分专门化时,如
template<int L, int R>
class Fixed<int64_t, 64, L, R> {};
然后应该使用专门化,因为前两个参数匹配
长话短说:您必须始终指定所有主模板成员。这正是我所寻找的使用语法。你能详细解释一下“专门化不会改变模板参数列表”是什么意思吗?这正是我想要的使用语法。你能详细解释一下“专业化不会改变模板参数列表”的意思吗。