今天,我遇到了两个以前从未见过的错误消息。这对我来说是全新的。
这是代码:
template<typename T>
struct adder { adder(const T &item) { } };
template<typename T>
void initializer(const T &item) { adder<T>(item); }
int main()
{
initializer("const string literal");
}
编译时,GCC 给出以下错误:
prog.cpp:在函数'void initializer(const T&)'中:
prog.cpp:6:错误:'adder <T> item'的声明遮蔽了参数
prog.cpp:在函数'void initializer(const T&)[with T = char [21]]':
prog.cpp:10: 从这里实例化
prog.cpp:6: 错误: 'adder<char [21]> item' 的声明遮蔽了参数
prog.cpp:6: 错误: 否调用 'adder<char [21]>::adder()'</strong>
prog.cpp:3 的匹配函数:注意:候选者是:adder<T>::adder(const T&) [with T = char [21]]
prog.cpp:3: 注意: adder<char [21]>::adder(const adder<char [21]>&)
见粗体字。一个错误显示两次,就是这个
错误:'<strong>adder<T> item ' 的声明遮蔽了参数
错误:'adder<char [21]> item ' 的声明遮蔽了参数
这是什么意思?为什么它使用不同的模板参数显示两次?第一个带T
,第二个带char [21]
?
编辑:是否声明名称为itemadder<T>(item)
的变量?但这不是我的本意。我认为它应该创建一个临时对象,将项目作为参数传递给构造函数。
我想知道标准中处理这个问题的部分!
另一个有趣的错误是:
错误:没有匹配函数调用'adder<char [21]>::adder()'</p>
这表明编译器正在寻找默认构造函数?但我想知道为什么编译器会在实际上我的代码在第 6 行没有使用它时寻找它?
ideone 的代码:http ://www.ideone.com/jrdLL