今天,我遇到了两个之前从未见过的错误信息,这对我来说完全是新鲜事。
以下是代码:
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: In function ‘void initializer(const T&)’: prog.cpp:6: error: declaration of ‘adder<T> item’ shadows a parameter prog.cpp: In function ‘void initializer(const T&) [with T = char [21]]’: prog.cpp:10: instantiated from here prog.cpp:6: error: declaration of ‘adder<char [21]> item’ shadows a parameter prog.cpp:6: error: no matching function for call to ‘adder<char [21]>::adder()’ prog.cpp:3: note: candidates are: adder<T>::adder(const T&) [with T = char [21]] prog.cpp:3: note: adder<char [21]>::adder(const adder<char [21]>&
看到粗体文字。一个错误被显示两次,即:
error: declaration of ‘adder<T> item’ shadows a parameter error: declaration of ‘adder<char [21]> item’ shadows a parameter 这是什么意思?为什么它用不同的模板参数显示两次?第一个使用了
T
,第二个使用了char [21]
?编辑:是否
adder<T>(item)
声明了名为item的变量?但这不是我的意图。我认为它应该创建一个将item作为参数传递给构造函数的临时对象。
我想知道处理此问题的标准部分!
另一个有趣的错误是:error: no matching function for call to ‘adder<char [21]>::adder()’
这表明编译器正在寻找默认构造函数?但我想知道为什么编译器在实际上我的代码在第6行没有使用它时会寻找它?
ideone上的代码:http://www.ideone.com/jrdLL
adder<T>(item)
的意思是adder<T> item;
- 然后这两个错误就有意义了。 - Erik