我们可以发送一对模板参数给另一对吗

Can we send pair a template argumrent another pair

我们可以在 C++ 中使用 pair 作为另一个 pair 的参数吗?

这是一个测试程序。

#include <iostream>
#include <utility>

int main()
{
    std::pair<int,int> m;
    m=std::make_pair(1,3);
    int r = 3;
    int *q = &r;
    int **p =&q;
    int **t = p;
    std::pair<int**,<std::pair<int,int> > > i(p,m);
    std::cout<<i[t];

    return 0;
}

这是错误,我得到了。

Test.cpp: In function ‘int main()’:
Test.cpp:12:45: error: template argument 2 is invalid
  std::pair<int**,<std::pair<int,int>>> i(p,m);
                                             ^

如果我把声明的格式改成下面这样写程序,

#include <iostream>
#include <utility>

int main()
{
    std::pair<int,int> m;
    m=std::make_pair(1,3);
    int r = 3;
    int *q = &r;
    int **p =&q;
    int **t = p;
    std::pair<
                int**,
                <
                    std::pair<
                                int,
                                int
                                >
                            >
                        > i(p,m);
    std::cout<<i[t];

    return 0;
}

还有一个错误。

Test.cpp: In function ‘int main()’:
Test.cpp:20:7: error: template argument 2 is invalid
       > i(p,m);
       ^
Test.cpp:20:14: error: expression list treated as compound expression in initializer [-fpermissive]
       > i(p,m);

可能是什么问题以及如何解决?


附带说明一下,我做了一个程序,并在 windows 7 机器上用一个非常老的 Dev-c++ 编译器编译了它,它使用了与上面类似的代码并且 运行 完美美好的。这是我大学里的一个实验室程序,只有那个编译器。

上面的代码,我 运行 在 windows 7 和 Ubuntu 16.04 上使用 GNU g++ 5.4.0

艾德奥内:Link to the actual program for reference

你也可以看看我在上面遇到的实际错误link。

你的代码有两个问题。

  1. 您的模板实例化中有一对多余的尖括号。
  2. cout参数没有意义

#include <iostream>
#include <utility>

int main()
{
    std::pair<int,int> m;
    m=std::make_pair(1,3);
    int r = 3;
    int *q = &r;
    int **p =&q;
    int **t = p;
    std::pair<
                int**,
                // < Omit this
                    std::pair<
                                int,
                                int
                                >
                            // > also this
                        > i(p,m);
    // std::cout<<i.[t]; indexing with a pointer value doesn't make sense
    // i. for a pair doesn't make sense, specify either first or second
    std::cout<<i.first[0]; // <<<< Did you mean something like this?

    return 0;
}

Check the compiling version live

这是不正确的:

std::pair<int**,<std::pair<int,int> > > i(p,m);

只需删除多余的 <>:

std::pair<int**, std::pair<int,int > > i(p,m);

此外,我不确定您在 cout 部分要做什么,但是 pair 没有 [] 运算符。您可以使用 firstsecond:

访问元素
i.first
i.second
i.second.first
i.second.second

如果您不想将一对嵌套到另一对中,您可能还对 std::tuple 感兴趣:

std::tuple<int**, int, int> i;