C++ MSVC2010的嵌套模板解决方案?
我偶然发现了上述嵌套模板的相同问题 以下代码:C++ MSVC2010的嵌套模板解决方案?,c++,templates,C++,Templates,我偶然发现了上述嵌套模板的相同问题 以下代码: # include <cstdlib> // for std::size_t template<std::size_t N> class Outer { public : template<typename T> class Inner { public : inline Inner<T> & operator ++ (void) ;
# include <cstdlib> // for std::size_t
template<std::size_t N>
class Outer
{
public :
template<typename T>
class Inner
{
public :
inline Inner<T> & operator ++ (void) ;
inline Inner<T> operator ++ (int) ;
} ;
} ;
template<std::size_t N>
template<typename T>
inline typename Outer<N>::template Inner<T> & Outer<N>::Inner<T>::operator ++ (void)
{ // ^^^^^^^^ Point Of Interest : MSVC is the only one who complains
// preincrement
}
template<std::size_t N>
template<typename T>
inline typename Outer<N>::template Inner<T> Outer<N>::Inner<T>::operator ++ (int)
{ // ^^^^^^^^ Point Of Interest
// postincrement
}
删除模板
关键字时,MSVC编译良好,而gcc变得愤怒:
error: non-template 'Inner' used as template
note: use 'Outer::template Inner' to indicate that it is a template
然后使用nested_-template
来取悦MSVC,因为它不喜欢template
- 如果不可能,如何重构/重新设计代码以避免嵌套模板的情况
另一种方法是在额外的头中分离所有嵌套模板,并在MSVC和GCC中使用不同的包含路径。我不知道这一点。它是在哪个boost库中完成的?我想看看boost开发人员是如何处理它的。@overcoder:IIRC它在
boost::function
库中使用。我认为这不是直接针对MSVC的,但其他编译器也遇到了这个问题。实际上,define应该在Boost的config头中(或者在附近的某个地方)。很高兴听到您的快速响应!我会查出来的。@overcoder:搜索BOOST\u嵌套的\u模板
,IIRC就是这个名字。@overcode:今天遇到了一个类似的宏,一个用法是在BOOST.Range
,特别是
error: non-template 'Inner' used as template
note: use 'Outer::template Inner' to indicate that it is a template
# ifdef MSVC
# define nested_template
# else
# define nested_template template
# endif