Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器选择了无效的模板专门化并失败_C++_Templates - Fatal编程技术网

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> {};
然后应该使用专门化,因为前两个参数匹配


长话短说:您必须始终指定所有主模板成员。

这正是我所寻找的使用语法。你能详细解释一下“专门化不会改变模板参数列表”是什么意思吗?这正是我想要的使用语法。你能详细解释一下“专业化不会改变模板参数列表”的意思吗。