模板类,其构造函数接收一个T* 参数shadow
代码:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。