我们可以发送一对模板参数给另一对吗
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。
你的代码有两个问题。
- 您的模板实例化中有一对多余的尖括号。
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;
}
这是不正确的:
std::pair<int**,<std::pair<int,int> > > i(p,m);
只需删除多余的 <>
:
std::pair<int**, std::pair<int,int > > i(p,m);
此外,我不确定您在 cout
部分要做什么,但是 pair
没有 []
运算符。您可以使用 first
和 second
:
访问元素
i.first
i.second
i.second.first
i.second.second
如果您不想将一对嵌套到另一对中,您可能还对 std::tuple
感兴趣:
std::tuple<int**, int, int> i;
我们可以在 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。
你的代码有两个问题。
- 您的模板实例化中有一对多余的尖括号。
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;
}
这是不正确的:
std::pair<int**,<std::pair<int,int> > > i(p,m);
只需删除多余的 <>
:
std::pair<int**, std::pair<int,int > > i(p,m);
此外,我不确定您在 cout
部分要做什么,但是 pair
没有 []
运算符。您可以使用 first
和 second
:
i.first
i.second
i.second.first
i.second.second
如果您不想将一对嵌套到另一对中,您可能还对 std::tuple
感兴趣:
std::tuple<int**, int, int> i;