Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы совместимости компилятора Microsoft с GCC и CLang

83K
20 апреля 2014 года
Mr.Sharps
7 / / 24.11.2013
Всем, добрый вечер) Сегодня столкнулся с проблемой совместимости компилятора Microsoft VC++ с g++ и clang. Начнём сразу с примера кода, который наглядно иллюстрирует проблему и гарантированно отлично работает и компилируется MS VC++ и который в свою очередь матерят открытые компиляторы g++ и clang. Объясню зачем мы все здесь собрались: есть два класса, Parent и Child как вы уже поняли они связаны родственными узами: Child наследует Parent , вообщем всё просто. А теперь самое горячее, согласно стандарту C++11 в инициализаторе конструктора класса разрешается вызывать другие конструкторы того же класса включая вызовы базовых конструкторов при наследовании .Как я уже сказал в VC++ всё отлично работает а вот собственно выхлоп g++ прикрепил ниже. Я конечно же понимаю что g++ не считает вызываемый конструктор Queue полем класса наследника которое можно было бы хоть как то проинициализировать, но исходя из вышесказанного я вроде бы делаю всё по стандарту но даже хваленый clang который якобы поддерживает аж C++14 выдаёт аналогичную ошибку комментарий к которой напрочь исключает возможность вызова одного конструктора в инициализаторе другого. Где собака зарыта?

Пример кода

Код:
template <typename T>
class Parent
{
protected:
    T val;
public:
    Parent(): val(){}
    Parent(T num): val(num){}
};

template <typename T>
class Child: public Parent<T>
{
protected:
    T val1;
public:
    Child(): Parent(), val1(){}
    Child(T num): Parent(num), val1(num){}
};

int main()
{
    auto xz = Child<int>(21);
    return 0;
}
выхлоп g++

 
Код:
g++ -std=c++11 test.cpp
test.cpp: In constructor ‘Child<T>::Child()’:
test.cpp:19:11: error: class ‘Child<T>’ does not have any field named ‘Parent’
   Child():Parent(),val1(){}
           ^
test.cpp: In constructor ‘Child<T>::Child(T)’:
test.cpp:20:16: error: class ‘Child<T>’ does not have any field named ‘Parent’
   Child(T num):Parent(num),val1(num){}
                ^
выхлоп clang

 
Код:
clang -std=c++11 test.cpp
test.cpp:19:11: error: member initializer 'Parent' does not name a non-static
      data member or base class
  Child():Parent(),val1(){}
          ^~~~~~~~
test.cpp:20:16: error: member initializer 'Parent' does not name a non-static
      data member or base class
  Child(T num):Parent(num),val1(num){}  
               ^~~~~~~~~~~
2 errors generated.
326
21 апреля 2014 года
sadovoya
757 / / 19.11.2005
А так:

 
Код:
template <typename T>
class Child: public Parent<T>
{
protected:
     T val1;
public:
     Child(): Parent<T>(),val1(){} //<T>
     Child(T num): Parent<T>(num), val1(num){} //<T>
};
260
21 апреля 2014 года
Ramon
1.1K / / 16.08.2003
Так что, "собрались мы здесь" совершенно зря.

PS: Читаем стандарт и пишем по нему же.
326
21 апреля 2014 года
sadovoya
757 / / 19.11.2005
Цитата:
согласно стандарту C++11 в инициализаторе конструктора класса разрешается вызывать другие конструкторы того же класса включая вызовы базовых конструкторов при наследовании


Тут требуется уточнение. Передача параметров в конструктор базового класса из инициализации в конструкторе наследника -- не новое в С++. А вот возможность использования одного конструктора класса в другом его-же консрукторе -- новшество стандарта С++11. В общем-то ваш код к нововведениям C++11 отношения не имеет и будет работать со старыми компиляторами (когда исправите указанную ошибку, ну и без auto разумеется).

К 11-му стандарту имеет отношение подобное:

Код:
#include <iostream>

class SomeClass {
    int x_;
public:
    SomeClass(int x): x_(x) {}
    SomeClass(): SomeClass(100) {}
    void print(){std::cout << x_ << std::endl;}
};

int main() {
    SomeClass sc;
    sc.print(); //выдаст 100
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог