【发布时间】:2011-03-14 11:09:39
【问题描述】:
今天,我遇到了两条以前从未见过的错误消息。这对我来说是全新的。
代码如下:
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:错误:'adderitem' 的声明隐藏了参数
prog.cpp:在函数'void initializer(const T&) [with T = char [21]]'中:
prog.cpp:10:从此处实例化
prog.cpp:6:错误:'adderitem' 的声明隐藏了参数
prog. cpp:6: 错误:没有匹配函数调用'adder::adder()'
prog.cpp:3:注意:候选者是:adder::adder(const T&) [with T = char [21]]
prog.cpp:3: 注意:adder::adder(const adder &)
查看粗体字。一个错误显示两次,就是这个
错误:“adder
item ”的声明遮蔽了参数
错误:‘adderitem ’的声明隐藏了一个参数
这是什么意思?为什么它用不同的模板参数显示两次?第一个是T,第二个是char [21]?
编辑:adder<T>(item) 是否声明名称为 item 的变量?但这不是我的本意。我认为它应该创建一个临时对象,将 item 作为参数传递给构造函数。
我想知道标准中处理此问题的部分!
其他有趣的错误是这样的:
错误:没有匹配的函数调用'adder
::adder()'
这表明编译器正在寻找默认构造函数?但我想知道为什么编译器要寻找它,而实际上我的代码在第 6 行没有使用它?
ideone 代码:http://www.ideone.com/jrdLL
【问题讨论】:
-
adder<T>(item)表示adder<T> item;- 然后这两个错误才有意义。 -
我编辑了我的答案,看看吧"
标签: c++ gcc diagnostics