VS2019 c ++ C3861 ошибка в шаблонах глубокого наследования - PullRequest
1 голос
/ 24 мая 2019

Я получаю ошибку C3861 с / permissive- compilations в VS2019, когда у меня есть глубокая иерархия наследования с самым производным шаблоном, обращающимся к защищенным символам из корня, производного от класса

class BaseClass
{
protected:
    void baseClassMethod()
    {
        m_value = 0;
    }

    int m_value;
};

template<typename T1>
class DerTmpl_1 : public BaseClass
{
public:
    T1 doTheThing(T1 t)
    {
        baseClassMethod();
        m_value = 123;
        return t;
    }
};

template<typename T1, typename T2>
class DerTmpl_2 : DerTmpl_1<T1>
{
public:
    T2 doTheOtherThing(T1 t1, T2 t2)
    {
        baseClassMethod();  // C3861 here, but only with /permissive-
        doTheThing(t1);     
        m_value = 456;      // C3861 here, but only with /permissive-
        return t2;
    }
};

Есть ли какие-либо указания относительно того, почему DerTmpl_2 :: doTheOtherThing не компилируется?

C3861 ошибка вывода

1>C:\Users\kevin\source\repos\cpp17-permissiveMinusTest\cpp17-permissiveMinusTest\cpp17-permissiveMinusTest.cpp(35,3): error C3861:  'baseClassMethod': identifier not found
1>C:\Users\kevin\source\repos\cpp17-permissiveMinusTest\cpp17-permissiveMinusTest\cpp17-permissiveMinusTest.cpp(37,3): error C3861:  'm_value': identifier not found

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Обратите внимание, что проблема не имеет ничего общего с глубокой иерархией наследования, это может произойти только при наследовании от шаблонов классов.Независимые имена не будут просматриваться в зависимых базовых классах, с другой стороны, поиск зависимого имени , используемого в шаблоне, откладывается до тех пор, пока не станут известны аргументы шаблона.

Вынеобходимо сделать имена зависимыми для имен из зависимого базового класса (который зависит от параметра шаблона T1), например,

this->baseClassMethod();
this->m_value = 456;

или

BaseClass::baseClassMethod();
BaseClass::m_value = 456;
3 голосов
/ 24 мая 2019

Вам необходимо использовать this для доступа к элементам данных базового класса, который зависит от параметра шаблона:

    this->baseClassMethod();  // C3861 here, but only with /permissive-
    doTheThing(t1);     
    this->m_value = 456;      // C3861 here, but only with /permissive-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...