Объявление перегруженной функции в глобальном пространстве имен как друга класса шаблона - PullRequest
0 голосов
/ 24 декабря 2018

Моя проблема проста.Я могу объявить перегруженную функцию в глобальном пространстве имен как друга класса шаблона во вложенном пространстве имен, используя фундаментальные типы, однако если я изменю определение и объявление функции, чтобы она возвращала size_t, я получаю ошибки C2510 и C4430.Это происходит только с типом возвращаемого значения функции.size_t в списке параметров не создает проблему.Я пробовал :: size_t, :: std :: size_t и std :: size_t.Ничто не похоже на работу.Что здесь происходит и почему?

Я использую MS Visual Studio 2015

Спасибо

ОБНОВЛЕНО: В комментарии я включил оставшийся код TestingApp.cpp.Я также включил stddef, который не решает проблему.Что касается конкретных сообщений об ошибках, которые я получил, это:

C2510   'size_t': left of '::' must be a class/struct/union TestingApp   
pointer.h   41  
C4430   missing type specifier - int assumed. Note: C++ does not support 
default-int TestingApp  pointer.h   41  

Строка 41, которая НЕ генерирует ошибки компиляции:

friend int ::fwrite<DATA_TYPE>(const Pointer<DATA_TYPE>& ptr, size_t count, FILE* stream);

Строка 41, которая Сгенерирует ошибки компиляции:

friend size_t ::fwrite<DATA_TYPE>(const Pointer<DATA_TYPE>& ptr, size_t count, FILE* stream);

Следующие два файла компилируются и запускаются без проблем.Однако, если я заменю int на size_t для возвращаемого типа (и ТОЛЬКО возвращаемого типа, сохраняя size_t в качестве второго параметра функции в любом случае) в прямом объявлении, объявлении друга и определении, я получу ошибки, указанные выше.

/*******Begin Pointer.h******/

#pragma once
#include <cstdio>

namespace FW{
    namespace Memory {
        template <typename DATA_TYPE> class Pointer;
    }
}

template <typename DATA_TYPE> inline
/* int works, size_t does not work */
int 
/* size_t */
fwrite(const 
FW::Memory::Pointer<DATA_TYPE>& ptr, size_t count, FILE* stream);

namespace FW{
    namespace Memory{

        template <typename DATA_TYPE> class Pointer {

 /*Line 41*/ friend 
             /* int works, size_t does not work */
             int 
             /* size_t */
             ::fwrite<DATA_TYPE>(const Pointer<DATA_TYPE>& ptr, size_t count, FILE* stream);

            public:
                /* Omitted for brevity */
            private:
               DATA_TYPE* m_pCurrent;

        };


    }
}

template <typename DATA_TYPE>
/* int works, size_t does not work */
int 
/* size_t */
fwrite<DATA_TYPE>(const FW::Memory::Pointer<DATA_TYPE>& ptr, size_t count, FILE* stream) {
    return fwrite(ptr.m_pCurrent, sizeof(DATA_TYPE), count, stream);
}

/*******End Pointer.h*******/


/*******Begin TestingApp.cpp******/

// TestingApp.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <cstdio>
#include <cstddef>
#include "..\DB\Pointer.h"

int main()
{
    unsigned long* pData = new unsigned long[100];
    for (size_t i = 0; i < 100; i++) {
        pData[i] = i;
    }
    FW::Memory::Pointer<unsigned long> ptr(pData);
    FILE* pFile = fopen("testFile", "wb");
    if (pFile) {
        fwrite(ptr, 10, pFile);
        fclose(pFile);
    }
    delete[] pData;
    pData = 0;
    return 0;
}

/ ***** End TestingApp.cpp ***** /

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