Страница 1 из 2
Мультипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 09:51
Сионист
Есть заголовочный файл, заинклаженный во много других файлов. А в нём есть шаблон функции
Код: Выделить всё
template <typename Type> std::wstring TypeInformation()
{
std::wstring Result;
Result+=L"<Terms>"; Result+=ToWString(sizeof(Type)); Result+=L"</Terms>\n";
return Result;
}
. Если этот шаблон явно специализировать
Код: Выделить всё
template <>
std::wstring TypeInformation<int>()
{
std::wstring Result;
Result+=L"<Terms>"; Result+=ToWString(sizeof(int)); Result+=L"</Terms>\n";
Result+=L"<Min>"; Result+=ToWString(std::numeric_limits<int>::min()); Result+=L"</Min>\n";
Result+=L"<Max>"; Result+=ToWString(std::numeric_limits<int>::max()); Result+=L"</Max>\n";
return Result;
}
, то среда ругается на специализацию, говорит, что
Functions.hpp|218|multiple definition of `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > TypeInformation<int>()'|
. Если специализацию вынести в отдельный cpp-файл, тогда среда ругается на сам шаблон, говорит, что
Functions.hpp|210|multiple definition of `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > TypeInformation<int>()'|
. Как с этим бороться?
Re: Мультипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 12:52
Absurd
Да можно сделать запросто все что ты там пытаешься изобразить. Попытайся хотябы понять как работает этот код.
Код: Выделить всё
#include <iostream>
#include <type_traits>
#include <sstream>
template <bool Q> struct Bool2Type {
enum { Value = Q };
};
template <typename Type> class TypeInformation {
static std::wstring get(Bool2Type<false>)
{
std::wostringstream Result;
Result << L"<Name>" << typeid(Type).name() << "</Name>\n";
Result << L"<Terms>" << sizeof(Type) << L"</Terms>\n";
return Result.str();
}
static std::wstring get(Bool2Type<true>)
{
std::wostringstream Result;
Result << L"<Name>" << typeid(Type).name() << "</Name>\n";
Result << L"<Terms>" << sizeof(Type) << L"</Terms>\n";
Result << L"<Min>" << std::numeric_limits<Type>::min() << L"</Min>\n";
Result << L"<Max>" << std::numeric_limits<Type>::max() << L"</Max>\n";
return Result.str();
}
public:
static std::wstring get()
{
return get(Bool2Type< std::is_arithmetic<Type>::value >());
}
};
int main()
{
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<std::string>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<int>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<unsigned>::get();
std::wcout << L"----------------------------------------\n";
return 0;
}
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 15:22
Сионист
Лучше ты попытайся понять, что у меня много файлов и шаблонная функция может вызваться из любого, при этом некоторые её версии должны быть специализированны явно.
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 15:25
Absurd
Судя по тому что ты опять насоздавал кучу
тем, этот код ты не понял. А ответ в нем содержится.
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 15:26
Сионист
Absurd писал(а):Судя по тому что ты опять насоздавал кучу
тем, этот код ты не понял. А ответ в нем содержится.
Разве?
1. Где здесь инклады?
2. За арифметический принимается и char, а для него нужна версия
Код: Выделить всё
template <typename Type> std::wstring TypeInformation()
{
std::wstring Result;
Result+=L"<Terms>"; Result+=ToWString(sizeof(Type)); Result+=L"</Terms>\n";
return Result;
}
.
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 15:30
Absurd
Где здесь инклады?
Ну вынеси Bool2Type и TypeInformation целиком в .h файл, блин. Все отлично скомпилируется.
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 15:44
Romeo
Absurd, он не понимает, как работает шаблоны, вот и всё. Ты ему не докажешь ничего, пока он сам до этого не дойдёт. А ты ему ещё Bool2Type из Александреску предъявил. Естественно человек перепугался и даже не стал разбираться в твоём коде, хотя он простой

Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 15:47
Romeo
Сионист, я удалил твою тему "Можно ли за один раз явно специализировать шаблон для всех действительных типов?", потому что ответ содержится в коде Absurd'а в этой теме. Перечитай его и попытайся осознать. Спрашивай, если что-то непонятно.
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 16:06
Сионист
Absurd писал(а):Ну вынеси Bool2Type и TypeInformation целиком в .h файл, блин.
А cpp остаётся один. У меня их 47, из них 46 инкладят шаблон.
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 16:08
Сионист
Romeo писал(а):Сионист, я удалил твою тему "Можно ли за один раз явно специализировать шаблон для всех действительных типов?", потому что ответ содержится в коде Absurd'а в этой теме. Перечитай его и попытайся осознать. Спрашивай, если что-то непонятно.
Нет. Арифменические - это и целые тоже, а их надо специализировать отдельно от действительных, и даже char, а для него нужен тот же текст, как для не числовых.