Член класса статического шаблона C ++ в качестве параметра по умолчанию для функции-друга - PullRequest
0 голосов
/ 25 февраля 2019

Почему использование статического члена класса шаблона в качестве параметра по умолчанию для функции-шаблона друга приводит к ошибке компиляции в c ++?Как работать?

Вот код:

#include <iostream>

template<typename T>
void func(T n);

template<typename T>
class MyClass
{
private:
    static T statTemp;
public:
    friend void func<>(T n);
};

template<typename T>
T MyClass<T>::statTemp(1);

template<typename T>
void func(T n = MyClass<T>::statTemp)
{
    std::cout << n << std::endl;
}

int main()
{
    func<int>();
}

На компиляции:

g ++ -std = c ++ 11 main.cpp

error: redeclaration of 'template<class T> void func(T)' may not have default arguments [-fpermissive]
 void func(T n = MyClass<T>::statTemp)
      ^~~~
In function 'int main()':
error: no matching function for call to 'func<int>()'
  func<int>();
            ^
note: candidate: 'template<class T> void func(T)'
 void func(T n = MyClass<T>::statTemp)
      ^~~~
note:   template argument deduction/substitution failed:
note:   candidate expects 1 argument, 0 provided
  func<int>();
            ^

Визуальная студия 2017

C2672   "func": No matching overloaded function found.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Язык не позволяет добавлять аргументы по умолчанию для шаблонных функций в более поздних объявлениях функции в той же области действия.

Стандартный проект C ++ 17 n4659 гласит:

11.3.6 Аргументы по умолчанию [dcl.fct.default]
...
4 Для не шаблонных функций аргументы по умолчанию могут быть добавлены в более поздних декларацияхфункции в той же области.

Поскольку func является функцией шаблона, не разрешается добавлять аргументы по умолчанию в более поздних объявлениях func в той же области.

Таким образом, GCC правильно отклоняет это так:

error: redeclaration of 'template<class T> void func(T)' may not have default arguments [-fpermissive]
 void func(T n = MyClass<T>::statTemp)
0 голосов
/ 25 февраля 2019

Я получил вашу программу для компиляции, однако, честно говоря, я не уверен, что именно я действительно сделал.Я могу только проявить свою интуицию и сделать все возможное, чтобы объяснить, что я только что сделал:

#include <iostream>

template<typename T>
void func();

template<typename T>
class MyClass
{
private:
    static T statTemp;
public:
    friend void func<T>();
};

template<typename T>
T MyClass<T>::statTemp(1);

template<typename T>
void func()
{
    T n = MyClass<T>::statTemp;
    std::cout << n << std::endl;
}

int main()
{
    func<int>();
}

Сначала я заметил ваш оригинал funct(T n), который вы объявили в верхней части файла, иожидалось, что T n будет передано в функцию.В основном вы не делаете такой вещи.Поэтому, когда вы вызываете func(T n) и ничего не передаете в функцию, компилятор злится, так как ожидает, что что-то будет передано. Возможно, вы можете перегрузить функцию, в которой вызывается другая func(T n), где вы ее передаете T n = MyClass<T>::statTemp;

Наконец, у вашего friend void func<>() не было типа шаблона, так что компилятор тоже был недоволен этим.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...