Рассмотрим этот синтетический пример.У меня есть два собственных проекта C ++ в моем решении Visual Studio 2010.Один - это консоль 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
Так как именно это произошло, этот компоновщик переопределяет версию lib TImage<char>
в версии exe TImage<char>
?Но поскольку exe-версия TImage<int>
не существует, она сохраняет версию lib TImage<int>
? .. Стандартизировано ли это поведение, и если да, то где я могу найти описание?
Update : объяснения эффекта, приведенные ниже, правильные, спасибо.Но вопрос был в том, «как именно это произошло»? .. Я ожидал получить ошибку компоновщика , например, «множественно определенные символы».Таким образом, наиболее подходящий ответ от Ответ Антонио Переса .