Моя проблема проста.Я могу объявить перегруженную функцию в глобальном пространстве имен как друга класса шаблона во вложенном пространстве имен, используя фундаментальные типы, однако если я изменю определение и объявление функции, чтобы она возвращала 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 ***** /