英特尔编译器不编译另一个类中的私有前向类声明

Posted

技术标签:

【中文标题】英特尔编译器不编译另一个类中的私有前向类声明【英文标题】:Intel compiler does not compile private forward class declaration in another class 【发布时间】:2009-09-18 11:17:20 【问题描述】:

我在使用英特尔编译器 11.1.xxx 时遇到了一些问题 在使用 MS CL 编译器进行编译期间不会出现这些问题。 而且我不明白代码有什么问题(外部boost库头文件) 我最终遇到了多个错误:

..\boost/log/attributes/attribute_set.hpp(148): 错误:声明不兼容 带有常量“bool fConstV”(声明 在第 147 行) 模板 朋友类迭代器; ^ 在以下期间检测到: 类“boost::log_mt::basic_attribute_set”的实例化 [with CharT=char]”在第 252 行 “..\boost/log/sources/basic_logger.hpp” 类“boost::log_mt::sources::basic_logger [with CharT=char, FinalT=boost::log_mt::sources::logger, ThreadingModelT=boost::log_mt::sources::single_thread_model]" 在第 738 行 “..\boost/log/sources/basic_logger.hpp” 类“boost::log_mt::sources::basic_composite_logger [with CharT=char, FinalT=boost::log_mt::sources::logger, 特征T=boost::mpl::ve ctor0]”在第 787 行 “..\boost/log/sources/basic_logger.hpp”

..\boost/log/attributes/named_scope.hpp(146): 错误:声明不兼容 带有常量“bool fConstV”(声明 在第 145 行) 模板 朋友类迭代器; ^ 在以下期间检测到: 类“boost::log_mt::attributes::basic_named_scope_list”的实例化 [with CharT=char]”在第 364 行 类“boost::log_mt::attributes::basic_named_scope”的实例化 [with CharT=char]”在第 94 行 “..\boost/log/formatters/named_scope.hpp” 类“boost::log_mt::formatters::fmt_named_scope”的实例化 [with CharT=char]”在第 270 行 "..\boost/log/formatters/named_scope.hpp"

属性集.hpp

    template< typename CharT >
    class basic_attribute_set
    
        /* ... */
        template< bool fConstV > class iter;
        template< bool fConstV > friend class iter;
        template< bool fConstV >

       class iter
       
            friend class iter< !fConstV >;
            friend class basic_attribute_set< CharT >;
            /* ... */
            /* ... */
       
    

basiclogger.hpp

   class logger : public basic_composite_logger< char, logger, single_thread_model, mpl::vector0< > >
   
       BOOST_LOG_FORWARD_LOGGER_CONSTRUCTORS(logger)
   ;

欢迎任何提示。

【问题讨论】:

我已经删除了 147 和 148,然后正确编译了代码,但我还没有链接它。如果二进制文件可以工作,我会更新此消息。 【参考方案1】:

也许在第 148 行你想要template &lt;bool fConstV&gt; friend class iter&lt;fConstV&gt;;?虽然iter 被声明为嵌套类,但我认为您不需要朋友声明;

【讨论】:

模板 朋友类 iter;这不起作用,目前唯一起作用的是删除展位前向声明。

以上是关于英特尔编译器不编译另一个类中的私有前向类声明的主要内容,如果未能解决你的问题,请参考以下文章

类成员的前向类声明

为啥我不能只用前向声明 C++ 声明一个类的静态成员?

为啥另一个函数中的函数声明会编译,它有啥作用?

另一个类中的方法“不存在”编译器错误[重复]

这个编译器错误意味着什么 - “C ++中'='token之前的声明中的qualified-id”?

idjl(Sun IDL 编译器)是不是支持前向声明?