我正在尝试创建std::unordered_map
,其中值是std::type_index
。以下代码段有效:
std::unordered_map<std::type_index, int> workingMap;
workingMap[typeid(int)] = 1;
workingMap[typeid(char)] = 2;
但是这个没有运行并抛出错误:
std::unordered_map<int, std::type_index> failingMap;
failingMap[1] = typeid(int);
failingMap[2] = typeid(char);
CS2512:'std :: type_index :: type_index':没有合适的默认构造函数。
我不完全理解这个错误,这些例子中的构造函数之间有什么区别?是否可以制作typeid(..)
值而不是密钥的地图?
答案 0 :(得分:20)
问题是operator[]
,而不是地图的实际使用。问题是如果找到不键,operator[]
将分配默认值并返回对该值的可修改引用,这对于std::type_index
是不可能的。您可以使用emplace
,insert
,try_emplace
或任何其他不需要默认构造函数的修饰符。
答案 1 :(得分:1)
我们当然可以为int main()
{
std::unordered_map<std::type_index, int> workingMap;
workingMap[typeid(int)] = 1;
workingMap[typeid(char)] = 2;
std::unordered_map<int, std::optional<std::type_index>> failingMap;
failingMap[1] = typeid(int);
failingMap[2] = typeid(char);
}
创建一个可以为空的包装器。
import {Observable, ReplaySubject} from 'rxjs/Rx';
public loadProfile(): Observable<any> {
console.log('loading profile');
return this.http.get('/profile').map(res => res.json());
}
public isUserLoggedInObs(): Observable<boolean> {
const userLoggedIn: ReplaySubject<boolean> = new ReplaySubject<boolean>;
this.loadProfile.first().subscribe(
user => userLoggedIn.next(user.loggedIn === true)
)
return userLoggedIn.asObservable();
}
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> {
return this.profileService.isUserLoggedInObs()
}
当然,现在我们有std :: optional ...
python3 manage.py makemigrations my_app
python3 manage.py migrate