C++ 如何在之前声明的另一个模板参数中使用模板参数

C++ 如何在之前声明的另一个模板参数中使用模板参数,c++,templates,parameters,declaration,C++,Templates,Parameters,Declaration,模板参数可以在另一个模板参数中使用,如下所示: template<typename T, T N> struct s { }; sum<int, 1, 2>::value sum<1, 2>::value template<T A, T B, typename T> struct sum { static T const value = A + B; }; 模板 结构 { }; 但是,如果在“N”之后声明“T”,是否可以引用“T”

模板参数可以在另一个模板参数中使用,如下所示:

template<typename T, T N>
struct s
{
};
sum<int, 1, 2>::value
sum<1, 2>::value
template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};
模板
结构
{
};
但是,如果在“N”之后声明“T”,是否可以引用“T”

这不起作用:

template<T N, typename T>
struct s
{
};
模板
结构
{
};
我们可以通过预先声明“T”或执行其他操作来帮助编译器吗

提前谢谢

编辑:由于前两个回答是“为什么你愿意这么做?”我将解释目标:

我想让编译器推断类型“T”,以便更容易地使用模板类

例如:

template<typename T, T A, T B>
struct sum
{
    static T const value = A + B;
};
模板
结构和
{
静态T常数值=A+B;
};
此模板可通过以下方式使用:

template<typename T, T N>
struct s
{
};
sum<int, 1, 2>::value
sum<1, 2>::value
template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};
sum::value
但如果可以这样使用它会更好:

template<typename T, T N>
struct s
{
};
sum<int, 1, 2>::value
sum<1, 2>::value
template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};
sum::value
从技术上讲,这应该是可能的,因为编译器知道“1”和“2”的类型:“int”,事实上它使用这些信息来找到函数的最佳重载。 因此,通过以下方式声明模板:

template<typename T, T N>
struct s
{
};
sum<int, 1, 2>::value
sum<1, 2>::value
template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};
模板
结构和
{
静态T常数值=A+B;
};

编译器可以利用它的功能从第一个和第二个参数提供的信息中推断出最后一个参数,然后找到最佳的模板进行实例化。

你不能。我不明白你为什么也这么做。

下面是垃圾,因为我没有正确阅读你的问题

事实上,我也看不出你想要达到什么目的

#include <iostream>

template<typename T, T N>
struct s
{
    T size() { return N; }
};


int main()
{
    s<int, 4> x;
    std::cout << x.size()<< '\n';

    //s<float, 3.14> f; //this doesn't compile
}
#包括
模板
结构
{
T size(){return N;}
};
int main()
{
sx;

std::cout就像其他人说的-不这是不可能的,编译器不能从非类型模板参数推断
t
的类型(对于函数,它从函数参数推断类型):

14.8.2.4/12

无法从非类型模板参数的类型推断模板类型参数

在任何情况下,都不会对类模板的参数进行任何推断

template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }
具有{}int的模板结构;
模板空隙f(具有_int);
int main(){having_int h;f(h);}

在这种情况下,
T
不会被推断为
int
-你必须明确地指定它。

谢谢你的回答:如果规范说不,那就是不。现在的问题是:为什么这种有限的行为似乎可以做这种推断?你有一些例子证明这个决定吗?谢谢。因为模板元编程安明从来就不是要表达的吗?:)不过这是一个有趣的问题。也许你们应该检查一下这是否已经被提出,或者为C++1x提出这个建议。