Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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,由于人们不以类似grep的方式阅读和比较代码,我立即声明这不是一个副本,而是我在阅读后想到的另一个副本。因此,请通读这篇文章,不要只看类名 template <typename T, int N> struct Vector { T data[N]; }; struct Dynamic { }; template <typename T, Dynamic> struct Vector { T* data; }; 我想要两个模板:一个接收编译时整数,另

由于人们不以类似grep的方式阅读和比较代码,我立即声明这不是一个副本,而是我在阅读后想到的另一个副本。因此,请通读这篇文章,不要只看类名

template <typename T, int N>
struct Vector {
    T data[N];
};

struct Dynamic {
};

template <typename T, Dynamic>
struct Vector {
    T* data;
};
我想要两个模板:一个接收编译时整数,另一个接收用作标记的类型

但这不起作用,因为无论出于何种原因,第二个模板被解释为专门化或重新定义?第一个


为什么模板不能在模板参数上消除歧义?有什么逻辑/编译原因吗?

因为这不是语言的工作方式;就这么简单


模板定义一次,然后可以选择以后专门化。它们没有超负荷语义。

因为这不是语言的工作方式;就这么简单


模板定义一次,然后可以选择以后专门化。它们没有超负荷语义。

就你的问题而言,答案是:因为。并非每个功能都是语言的一部分

就您似乎想要实现的目标而言,您可以尝试模板专业化,尽管我个人以前没有在非类型参数中使用过它,但我明白它不起作用的原因

template <typename T, int N>
struct Vector
{
    T data[N];
};

const int Dynamic = INT_MAX;

template <typename T>
struct Vector<T, Dynamic>
{
    T* data;
};

就你的问题而言,答案是:因为。并非每个功能都是语言的一部分

就您似乎想要实现的目标而言,您可以尝试模板专业化,尽管我个人以前没有在非类型参数中使用过它,但我明白它不起作用的原因

template <typename T, int N>
struct Vector
{
    T data[N];
};

const int Dynamic = INT_MAX;

template <typename T>
struct Vector<T, Dynamic>
{
    T* data;
};


有没有这样的建议?我不明白为什么这样做没有好处。@Dean:我不明白为什么会有好处。你可以自己写并提交这样一个提案,但不要期望它去任何地方。有这样的提案吗?我不明白为什么这样做没有好处。@Dean:我不明白为什么会有好处。你可以自己写并提交这样的建议,但不要期望它会有任何结果。你可以继续问,但你不会得到你想要的答案:-因为语言不允许你这么做。嗯,我只是好奇,如果这看起来像是一个转载,我很抱歉。我只是不明白为什么用不同的参数类型(例如类型和非类型)重载模板会是一个糟糕的主意,但这不是一个思考好主意的网站。我不知道你想在那里做什么,由于没有模板结构向量,但您试图以某种方式将动态作为第二个参数传递给它。您应该在std建议或std讨论邮件列表中讨论此问题。您可以继续提问,但您不会得到您想要的答案:-因为语言不允许您这样做。呃,我只是好奇,如果这看起来像是一个重新发布,那么很抱歉。我只是不明白为什么用不同的参数类型(例如类型和非类型)重载模板会是一个糟糕的主意,但这不是一个思考好主意的网站。我不知道你想在那里做什么,由于没有模板结构向量,但您试图以某种方式将动态传递给它作为第二个参数。您应该在std提案或std讨论邮件列表中讨论这一点。是的,这是可行的,但我不明白为什么我不能有两个模板,一个接受typename,int,另一个接受签名typename,typename。这些都是可以区分的,我想它只是不够模糊,还没有成为实现的优先事项。在C++中花费大量的时间,往往会成为寻找模拟你真正想要做的事情的方法。是的,但是我不明白为什么我不能有两个模板,一个接受一个类型名,一个int,一个带有签名类型名,类型名。这些都是可以区分的,我想它只是不够模糊,还没有成为实现的优先事项。在C++中花费大量时间往往会成为寻找模拟你真正想做的事情的方法。