Мулипальная дефениция шаблона. Как с ней бороться?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Есть заголовочный файл, заинклаженный во много других файлов. А в нём есть шаблон функции

Код: Выделить всё

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>()'|
. Как с этим бороться?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Да можно сделать запросто все что ты там пытаешься изобразить. Попытайся хотябы понять как работает этот код.

Код: Выделить всё

#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;
}
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Лучше ты попытайся понять, что у меня много файлов и шаблонная функция может вызваться из любого, при этом некоторые её версии должны быть специализированны явно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Судя по тому что ты опять насоздавал кучу тем, этот код ты не понял. А ответ в нем содержится.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

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;
}
.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Где здесь инклады?
Ну вынеси Bool2Type и TypeInformation целиком в .h файл, блин. Все отлично скомпилируется.
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Absurd, он не понимает, как работает шаблоны, вот и всё. Ты ему не докажешь ничего, пока он сам до этого не дойдёт. А ты ему ещё Bool2Type из Александреску предъявил. Естественно человек перепугался и даже не стал разбираться в твоём коде, хотя он простой :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист, я удалил твою тему "Можно ли за один раз явно специализировать шаблон для всех действительных типов?", потому что ответ содержится в коде Absurd'а в этой теме. Перечитай его и попытайся осознать. Спрашивай, если что-то непонятно.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Absurd писал(а):Ну вынеси Bool2Type и TypeInformation целиком в .h файл, блин.
А cpp остаётся один. У меня их 47, из них 46 инкладят шаблон.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Сионист, я удалил твою тему "Можно ли за один раз явно специализировать шаблон для всех действительных типов?", потому что ответ содержится в коде Absurd'а в этой теме. Перечитай его и попытайся осознать. Спрашивай, если что-то непонятно.
Нет. Арифменические - это и целые тоже, а их надо специализировать отдельно от действительных, и даже char, а для него нужен тот же текст, как для не числовых.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить