@MikeJones: Visual не выполняет двухпроходную проверку шаблона (которая не соответствует стандарту) и поэтому не проверяет независимый код. Для g ++ (который выполняет проверку 2 прохода), они упускают возможность диагностировать это.

я есть следующий код, который прекрасно компилируется в Visual Studio и g ++, но в Clang я получаю ошибку «ошибка:« ns :: B »является неполным типом»

хиджры

#pragma once
namespace ns
{
    class B;

    class A
    {
        friend class B;
        class Inner
        {
        public:
            int x;
            Inner(int x) : x(x) {}
        };
    public:
        template<typename T>
        T getB(int i)
        {
            B b = B(Inner(i));
            return T(b);
        }

    };
}

B.h

#pragma once
#include "A.h"

namespace ns
{
    class B
    {
        A::Inner i;
    public:
        B(A::Inner i) : i(i)
        {}

        operator int() const
        {
            return i.x;
        }
    };
}

main.cpp

#include "A.h"
#include "B.h"

int main()
{
    ns::A a;
    return a.getB<int>(5);
}

Насколько я понимаю, код должен работать, потому что к моменту создания шаблона B будет завершено. Это правильно? И если так, есть ли способ обойти проблему в Clang?

Ответы на вопрос(1)

Ваш ответ на вопрос