【问题标题】:Returning inclass structure返回类内结构
【发布时间】:2012-12-22 11:47:35
【问题描述】:

我有一个具有以下结构的模板类

//CFoo.hpp (header file)
template <typename T>
class CFoo {
        struct SFoo {
            T *ptr;
            /* rest is irrelevant */
        } *foo;

    public:
    /* omitting irrelevant parts */
    SFoo* get();
};

现在,如果我在头文件中实现 SFoo* get() 方法,一切正常。但是,如果我将声明和定义分开,我的代码将停止处理以下编译错误。

//CFoo.cpp (source code, example 1)
/* omitting irrelevant parts */
template <typename T>
SFoo* CFoo<T>::get() { return foo; } //ERROR HERE

错误:&lt;where-is-the-error&gt;: error: ‘SFoo’ does not name a type

//CFoo.cpp (source code, example 2)
/* omitting irrelevant parts */
template <typename T>
CFoo<T>::SFoo* CFoo<T>::get() { return foo; } //ERROR HERE

错误:&lt;where-is-the-error&gt;: error: need ‘typename’ before ‘CFoo&lt;T&gt;::SFoo’ because ‘CFoo&lt;T&gt;’ is a dependent scope

我期待有关如何解决此问题的任何提示。提前致谢。

【问题讨论】:

  • 您是否按照最后一个错误提示输入typename
  • @Timbo 把这个关键字放在哪里?我想我做对了。

标签: c++ class templates


【解决方案1】:

您必须使用typename 限定依赖类型。见Where and why do I have to put the "template" and "typename" keywords?

//CFoo.cpp (source code, example 2)
/* omitting irrelevant parts */
template <typename T>
typename CFoo<T>::SFoo* CFoo<T>::get() { return foo; }
^^^^^^^^

在 C++11 中,您可以改用 auto,因为 SFoo 将在函数名之后的范围内

template <typename T>
auto CFoo<T>::get() -> SFoo* { return foo; }

【讨论】:

  • 现在所有 C++ 需要做的就是将 auto 替换为关键字 functionvar,这样我们就拥有了一门体面的语言。 var x = 1;function foo() -&gt; int { return 42; }
【解决方案2】:

在类声明之外时,您需要完全限定SFootypename CFoo&lt;T&gt;::SFoo

【讨论】:

    【解决方案3】:

    通常,只要依赖于模板参数的名称是类型,就必须使用typename

    template <typename T>
    typename CFoo<T>::SFoo* CFoo<T>::get() { return foo; }
    

    § 14.6.2 名称解析

    在模板声明或定义中使用的名称,即 假定依赖于模板参数不命名类型,除非 适用的名称查找找到一个类型名称或该名称是合格的 通过关键字类型名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 2015-02-25
      • 2021-09-24
      • 2021-06-12
      • 2018-04-27
      相关资源
      最近更新 更多