c ++ нотация — пространство имен — класс — функция

Я следую простому учебнику, чтобы создать DLL.
В процессе, я немного запутался с некоторыми обозначениями в файле cpp

dll.h - the header file
#blablablabla
namespace TutTest {
class TutTestClass { //for very complicated math!!!
public:
static dll_API double Add(double a, double b);
static dll_API double Subtract(double a, double b);
static dll_API double Multiply(double a, double b);
};
}

dll.cpp - the cpp file :)
#blablablabla include and such
namespace TutTest{
double TutTest::Add(double a, double b){
return a + b;
}
double TutTestClass::Subtract(double a, double b){
return a - b;
}
double TutTest::TutTestClass::Multiply(double a, double b){
return a * b;
}
}

В приведенном выше файле .cpp нотацией по умолчанию (используемой в учебном пособии) является «double TutTest :: …», однако я поэкспериментировал с этим и заметил, что и «TutTestClass ::», и «TutTest :: TutTestClass :: msgstr «кажется действительным, так как среда IDE не выдает никаких ошибок / предупреждений.

Так что мне было интересно, означают ли 3 обозначения то же самое? они эквивалентны?
если да, есть ли разница между нотациями, кроме стиля персонального кодирования?
Или эти обозначения отличаются по значению друг от друга?

1

Решение

TutTestClass::Subtract правильный. Subtract является (статической) функцией-членом класса TutTestClassтак что вы должны квалифицировать его соответственно.

TutTest::TutTestClass::Multiply технически правильно, но странно. Внутри пространства имен TutTest, имя TutTestClass относится к TutTest::TutTestClass автоматически, поэтому излишне явно указывать это имя.

TutTest::Add не должен компилироваться. Что это пытается сделать, это определить функцию пространства имен области Add в пространстве имен TutTest, Однако вы можете использовать только определенное имя для объявления функции области имен, когда

  1. функция уже была объявлена ​​в пространстве имен AND

  2. объявление происходит вне пространство имен в вопросе.

Ничто из этого не относится к вашему делу.

2

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

Пространство имен включает себя и свои якорные магазины, следовательно TutTest:: внутри TutTest ничего не делает.

Но только из-за этого, TutTest::Add это не то же самое, что TutTest::TutTestClass::Add, (вы на самом деле определяете другую функцию, которая никогда не была объявлена)

внутри namaspace TutTest { ... } ты можешь избежать TutTest:: но чтобы определить членов класса (даже если они статические) за пределами классов, вам нужно указать имя функции в соответствии с классом, которому она принадлежит.

1

По вопросам рекламы [email protected]