Страница 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, а для него нужен тот же текст, как для не числовых.