我们可以发送一对模板argumrent另一对

时间:2016-11-15 18:03:46

标签: c++ std-pair

我们可以在C ++中使用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 ++编译器中编译它,它使用类似于上面的代码并且运行得非常好。这是我大学里的一个实验室程序,只有那个编译器。

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

Ideone:Link to the actual program for reference

您可能还会看到我在上述链接中遇到的实际错误。

2 个答案:

答案 0 :(得分:1)

您的代码存在两个问题。

  1. 模板实例化中有一对多余的尖括号。
  2. cout参数毫无意义
  3. #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

答案 1 :(得分:1)

这是不正确的:

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;