我正在声明一对字符串映射到一对,如下所示:
std::map<std::wstring,
std::pair<std::pair<long, long>,
std::pair<long, long>>> reference;
我将其初始化为:
reference.insert(L"First",
std::pair<std::pair<long, long>,
std::pair<long, long>>(std::pair<long, long>(-1, -1),
std::pair<long, long>(0, 0)));
但是,Visual C ++给出了错误“C2664,没有构造函数可以采用源类型,或构造函数重载解析是模糊的”。
我是新手使用模板和STL,我不知道我做错了什么。
答案 0 :(得分:17)
无法正确解析>>>
(除非您有C ++ 0x编译器)。
更改为> > >
此:
reference.insert("First",
应该是:
reference.insert(L"First",
^^^
还有一个实用功能可以使对的构造更容易:
std::pair<std::pair<long, long>, std::pair<long, long>>(std::pair<long, long>(-1, -1), std::pair<long, long>(0, 0))
可以:
std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L))
试试这个:
reference[L"First"]
= std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L));
答案 1 :(得分:2)
C ++因连续的“&gt;”而感到困惑关闭模板时,因为它将其解释为移位运算符。
在结束模板之间添加空格,更改&gt;&gt;&gt;到&gt; &GT; &GT;
答案 2 :(得分:2)
map::insert
本身只需要一个std::pair
参数,而不是两个参数。您可以使用std::make_pair
(从函数参数中推断模板参数)来整理代码,以获得类似的内容:
reference.insert(std::make_pair("First",
std::make_pair(std::make_pair(-1L,-1L),
std::make_pair(0L,0L))));
答案 3 :(得分:0)
在调试此类事物时,有助于使用typedef。
// test1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <map>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::pair<long, long> ElementType;
typedef std::pair<ElementType, ElementType> ValueType;
typedef std::wstring KeyType;
std::map<KeyType, ValueType> reference;
KeyType key = L"First";
reference[key] = ValueType(ElementType(-1, -1), ElementType(0, 0));
return 0;
}
答案 4 :(得分:0)
您可以通过创建辅助函数来创建辅助函数来简化代码,这些对完全类似于标准库中可用的std::make_pair
辅助函数。同时使用地图operator[]
进行插入会使代码更易于阅读:
template<typename T, typename U, typename V, typename W>
std::pair< std::pair<T,U>, std::pair<V,W> > make_pair_pair(T t, U u, V v, W w) {
// using std::make_pair instead of the constructor for better readability
return std::make_pair(std::make_pair(t, u), std::make_pair(v, w));
}
reference[L"First"] = make_pair_pair(1,2,3,4);