考虑这个综合示例。我的 Visual Studio 2010 解决方案中有两个本机 C++ 项目。一个是控制台exe,另一个是lib。
lib中有两个文件:
// TImage.h
template<class T> class TImage
{
public:
TImage()
{
#ifndef _LIB
std::cout << "Created (main), ";
#else
std::cout << "Created (lib), ";
#endif
std::cout << sizeof(TImage<T>) << std::endl;
}
#ifdef _LIB
T c[10];
#endif
};
void CreateImageChar();
void CreateImageInt();
和
// TImage.cpp
void CreateImageChar()
{
TImage<char> image;
std::cout << sizeof(TImage<char>) << std::endl;
}
void CreateImageInt()
{
TImage<int> image;
std::cout << sizeof(TImage<int>) << std::endl;
}
还有一个exe文件:
// main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
TImage<char> image;
std::cout << sizeof(TImage<char>) << std::endl;
CreateImageChar();
CreateImageInt();
return 0;
}
我知道,我实际上不应该这样做,但这只是为了了解正在发生的事情。那就是,会发生什么:
// cout:
Created (main), 1
1
Created (main), 1
10
Created (lib), 40
40
那么这到底是怎么发生的,链接器用TImage<char>
exe 的版本覆盖了 lib 的版本TImage<char>
?但是由于没有 exe 的版本TImage<int>
,它保留了 lib 的版本TImage<int>
?.. 这种行为是否标准化,如果是,我在哪里可以找到描述?
更新:下面给出的效果解释是正确的,谢谢。但问题是“这到底是怎么发生的”?..我希望得到一些链接器错误,比如“多重定义的符号”。所以最合适的答案来自Antonio Pérez 的回复。