MSVC++ 编译器错误 C2923 传递模板参数
MSVC++ Compiler error C2923 when passing template argument
我有一个struct Person
的multi_index_container
:
struct Person {
std::string firstName;
std::string lastName;
int id;
bool operator <(const Person& rhs) const {return id < rhs.id;}
};
//index tags
struct BaseIndexTag {};
struct FirstName : BaseIndexTag {};
struct LastName : BaseIndexTag {};
struct ID : BaseIndexTag {};
namespace bmi = boost::multi_index;
typedef boost::multi_index_container<
Person,
bmi::indexed_by<
//PinsConnection operator < ordering
bmi::ordered_unique<bmi::tag<ID>, bmi::identity<Person> >,
//order by first name
bmi::ordered_non_unique<bmi::tag<FirstName>, bmi::member<Person, std::string, &Person::firstName> >,
//Order by last name
bmi::ordered_non_unique<bmi::tag<LastName>, bmi::member<Person, std::string, &Person::lastName> >
>
> PersonMultiSet;
以及 boost iterator_adaptor
的包装类:
template <
typename I //Internal iterator type
, typename C //Container class
>
class IteratorAdaptor : public boost::iterator_adaptor <
IteratorAdaptor<I,C>, //Derived
I, //Base
boost::use_default, //Value
boost::forward_traversal_tag> //Traversal
{
private:
friend class boost::iterator_core_access;
friend C;
public:
IteratorAdaptor()
: typename IteratorAdaptor<I,C>::iterator_adaptor_() {}
explicit IteratorAdaptor(I& b)
: typename IteratorAdaptor<I,C>::iterator_adaptor_(b) {}
};
最后,我为 PersonMultiSet
编写了一个包装类,以便向该类的用户公开一个干净的接口,并避免 boost multi_index_container
有点麻烦的接口:
class PersonContainer {
public:
typedef IteratorAdaptor<PersonMultiSet::index<ID>::type::iterator, PersonContainer> IDIterator;
typedef IteratorAdaptor<PersonMultiSet::index<ID>::type::const_iterator, PersonContainer> IDConstIterator;
typedef IteratorAdaptor<PersonMultiSet::index<FirstName>::type::iterator, PersonContainer> FirstNameIterator;
typedef IteratorAdaptor<PersonMultiSet::index<FirstName>::type::const_iterator, PersonContainer> FirstNameConstIterator;
typedef IteratorAdaptor<PersonMultiSet::index<LastName>::type::iterator, PersonContainer> LastNameIterator;
typedef IteratorAdaptor<PersonMultiSet::index<LastName>::type::const_iterator, PersonContainer> LastNameConstIterator;
template <typename T> //tag
void foo(IteratorAdaptor<PersonMultiSet::index<T>::type::iterator, PersonContainer> &it)
{
//...
}
private:
PersonMultiSet people;
};
在 VS2010 下编译此代码会在函数 foo 的声明上产生以下错误:
1> main.cpp
1>main.cpp(70): warning C4346: 'boost::multi_index::multi_index_container<Value,IndexSpecifierList>::index<T>::boost::multi_index::multi_index_container<Value1,IndexSpecifierList1,Allocator1>::index<Tag>::type::iterator' : dependent name is not a type
1> with
1> [
1> Value=Person,
1> IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<ID>,boost::multi_index::identity<Person>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<FirstName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x0)>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<LastName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x20)>>>
1> ]
1> prefix with 'typename' to indicate a type
1>main.cpp(70): error C2923: 'IteratorAdaptor' : 'boost::multi_index::multi_index_container<Value,IndexSpecifierList>::index<T>::boost::multi_index::multi_index_container<Value1,IndexSpecifierList1,Allocator1>::index<Tag>::type::iterator' is not a valid template type argument for parameter 'I'
1> with
1> [
1> Value=Person,
1> IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<ID>,boost::multi_index::identity<Person>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<FirstName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x0)>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<LastName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x20)>>>
1> ]
1>
1>Build FAILED.
编译器似乎不允许在第一次使用时确定类型IteratorAdaptor<PersonMultiSet::index<T>::type::iterator
(在我尝试实例化PersonContainer
或调用 foo 之前,我就收到了此错误)。我做错了什么?
编译器会给你一个提示,说明出了什么问题:
带有"类型名称"的前缀以指示类型
因此,您需要在"有问题"参数之前添加typename
。
void foo(IteratorAdaptor<PersonMultiSet::index<T>::type::iterator,
PersonContainer> &it)
必须是:
// vvvvvvvv
void foo( IteratorAdaptor< typename PersonMultiSet::index<T>::type::iterator,
PersonContainer> &it)
相关文章:
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 告诉c++编译器该参数没有别名
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 推断模板参数的编译器
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 模板模板参数和模板别名:编译器错误?
- 如果可推导类型上有替换,可变参数模板类型推导会使编译器崩溃
- 如何使用传递给编译器的相同参数在 cmake 中运行命令?
- 编译器是否强制根据模板参数计算表达式?
- C++自定义分配器大小参数作为模板参数会引发编译器错误
- 为什么编译器抱怨 std::thread 参数在转换为右值后必须是可调用的?
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- 编译器确定参数是给定还是省略
- 当作为参数传入时,是否可以由编译器指定模板类参数?
- 在没有对象参数编译器错误的情况下调用非静态成员函数
- 默认模板参数编译器错误
- 缺少默认参数-编译器错误