模板类,其构造函数接收一个T* 参数shadow

编程语言 2026-07-10

代码:

template <class TOwner>
class MyClass final {
public:
    static MyClass factoryMethod(TOwner* const a_owner) {
        MyClass(a_owner); // Does not compile
        //MyClass { a_owner }; // Compiles
    }

private:
    MyClass(TOwner* const a_owner) :
        m_owner(a_owner)
    {}

    TOwner* m_owner;
};

int main() { return 0; }

错误:

foo.cpp: In static member function 'static MyClass<TOwner> MyClass<TOwner>::factoryMethod(TOwner*)':
foo.cpp:5:17: error: declaration of 'MyClass<TOwner> a_owner' shadows a parameter
    5 |         MyClass(a_owner); // Does not compile
      |                 ^~~~~~~
foo.cpp:4:48: note: 'TOwner* const a_owner' previously declared here
    4 |     static MyClass factoryMethod(TOwner* const a_owner) {
      |                                  ~~~~~~~~~~~~~~^~~~~~~

编译(GCC 10.2.1):

g++ foo.cpp --std=c++17

我意识到实际的解决办法是使用我注释掉的那段语法,但我想知道为什么这会被视为一个编译错误。算是一种最让人头疼的解析吗?

解决方案

原始代码的错误在于缺少 return

template <class TOwner>
class MyClass final {
public:
    static MyClass factoryMethod(TOwner* const a_owner) {
        return MyClass(a_owner); // Compiles after missing return added
    }

private:
    MyClass(TOwner* const a_owner) :
        m_owner(a_owner)
    {}

    TOwner* m_owner;
};

int main() { return 0; }
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章