Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> msvc, ODR и CRTP 
:(
    Опции темы
Abyx
Дата 4.5.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



берем .h файл
Код

// some.h

struct test
{
    static int x;
}

int test::x = 0;

включаем его в два и более .cpp файла, компилим, и получаем ошибку что test::x определен в двух и более модулях.

пишем такой код
Код

// some.h

template<typename Derived>
struct base
{
    typedef base base_t;
    static int x;
};

struct test : base<test>
{    
};

int test::base_t::x = 0;

и ошибка пропадает.

как так? фича языка? фича msvc?

(проверял на msvc2008 и msvc2010RC1)

Это сообщение отредактировал(а) Abyx - 4.5.2010, 19:00
PM MAIL   Вверх
borisbn
Дата 4.5.2010, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Простите за сарказм и за  smile но всвязи с названием темы вспомнился бородатый анекдот:
приходит к опытному программисту ( О ) новичок ( Н )
Н: посмотри, тут что-то не работает. Никак не пойму, то ли это TCP, то ли API, то ли MFC, то ли VPN, то ли COM, то ли DCOM, то ли MSVC, то ли STL
О: сдаётся мне, что проблема в ДНК



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
HellStranger
Дата 30.7.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 1.9.2009

Репутация: -2
Всего: -1



Попробуй #ifndef воспользоваться. Или, если ты под студией #pragma once.
PM MAIL   Вверх
Abyx
Дата 30.7.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



HellStranger, это тут ни при чем. Проблема в ODR, а не в повторном определении одной и той же сущности в одной единице трансляции.
PM MAIL   Вверх
Earnest
Дата 30.7.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Возможно, фокус тут просто в том, что элементы шаблонов при линковке обрабатываются несколько своеобразно. Я имею в виду следующее: если использовать заголовок с шаблоном в двух единицах компиляции, то используемые функции будут инстанционированы в каждой единице, но потом при сборке остается только один экземпляр. Этому есть какое-то специальное название, но я не помню точно. Возможно, с экземплярами статических переменных поступают так же.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0818 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.