виртуальное наследование с ковариантным типом возврата и аргументом класса шаблона, ошибка LINK в vs2013

Это мой код:

#include <vector>
struct A
{
typedef std::vector<int> vec; //(1) template type
virtual A& test(vec) = 0;
};

struct B : public virtual A //(2) virtual inheritance
{
virtual B& test(vec) override //(3) covariant return type
{
return *this;
}
};

//std::vector<int> vv, cc(vv); //(4) explicit instantiate copy-ctor

int main()
{
B b;
b.test({});
}

Visual C ++ 2013 дал мне ошибку ссылки.

error LNK2001: unresolved external symbol "public: __thiscall
std::vector<int,class std::allocator<int> >::vector<int,class
std::allocator<int> >(class std::vector<int,class
std::allocator<int> > const &)"(??0?$vector@HV?$allocator@H@std@@@std@@QAE@ABV01@@Z)

Я попробовал gcc, и он компилируется.

Если я сделаю одно из следующих действий, VC скомпилирует:

  1. измените строку (1) на не шаблонный тип
  2. убрать «виртуальный» в строке (2)
  3. изменить тип возврата на A& в линии (3)
  4. раскомментируйте строку (4)

Зачем?

8

Решение

Это, скорее всего, ошибка VC; Clang и G ++ оба принимают этот код. Интересно, что изменение кода, чтобы не использовать список инициализаторов в вызове B.test() как показано ниже также устраняет ошибку, которая заставляет меня поверить, что есть проблема с поддержкой списка инициализаторов VC ++, которая вызывает это.

#include <vector>
struct A
{
typedef std::vector<int> vec; //(1) template type
virtual A& test(vec) = 0;
};

struct B : public virtual A //(2) virtual inheritance
{
virtual B& test(vec) override //(3) covariant return type
{
return *this;
}
};

//std::vector<int> vv, cc(vv); //(4) explicit instantiate copy-ctor

int main()
{
A::vec v;
B b;
//b.test({});
b.test(v);
}
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector